正题
题目大意:https://www.luogu.org/problemnew/show/P3275
题目大意
对于nnn个值,给出一系列不等式。求每个值的最小正整数。
解题思路
差分约束
codecodecode
#include<cstdio>
#include<queue>
#include<cstring>
#define MN 300005
using namespace std;
queue<int> q;
struct line{int to,w,next;
}a[MN*30];
int n,m,tot,f[MN],ls[MN],len[MN];
bool v[MN];
void addl(int x,int y,int w)
{a[++tot].to=y;a[tot].w=w;a[tot].next=ls[x];ls[x]=tot;
}
int spfa()
{q.push(n);v[n]=1;while (!q.empty()){int x=q.front();q.pop();v[x]=0;for (int i=ls[x];i;i=a[i].next){int y=a[i].to;if (f[x]+a[i].w>f[y]){f[y]=f[x]+a[i].w;len[y]++;if(len[y]>=n) {printf("-1");return 0;}if (!v[y]){v[y]=1;q.push(y);}}}}long long ans=0;for(int i=1;i<n;i++)ans+=f[i];printf("%lld",ans);return 0;
}
int main()
{freopen("data.in","r",stdin);scanf("%d%d",&n,&m);for(int i=1;i<=m;i++){int S,x,y;scanf("%d%d%d",&S,&x,&y);if(S==1){addl(x,y,0);addl(y,x,0);}if(S==2){if(x==y){printf("-1");return 0;}addl(x,y,1);}if(S==3)addl(y,x,0);if(S==4){if(x==y){printf("-1");return 0;}addl(y,x,1);}if(S==5)addl(x,y,0);}n++;for(int i=n-1;i;--i)addl(n,i,1);spfa();
}