题解:
差分约束系统
建立反相变
然后看看有木有无穷大即可
代码:
#include<bits/stdc++.h> using namespace std; const int N=2005; int T,n,m,fi[N],tot,x,y,z,f[N],dis[N],num[N],ne[N],sl[N],zz[N]; queue<int > Q; void add(int x,int y,int z) { ne[++tot]=fi[x]; fi[x]=tot; zz[tot]=y; sl[tot]=z; } int main() { scanf("%d",&T); while (T--) { scanf("%d%d",&n,&m); memset(fi,0,sizeof fi); tot=0; int flag=1; while (m--) { scanf("%d%d%d",&x,&y,&z); add(x-1,y,z);add(y,x-1,-z); } while (!Q.empty())Q.pop(); for (int i=0;i<=n;i++)dis[i]=num[i]=0,Q.push(i),f[i]=1; while (!Q.empty()) { int now=Q.front();Q.pop(); f[now]=0; for (int i=fi[now];i;i=ne[i]) if (dis[zz[i]]<dis[now]+sl[i]) { dis[zz[i]]=dis[now]+sl[i]; if (!f[zz[i]]) { num[zz[i]]++; if (num[zz[i]]>n) { puts("false"); flag=0; break; } f[zz[i]]=1; Q.push(zz[i]); } } if (!flag)break; } if (flag)puts("true"); } }