bzoj1202 狡猾的商人
并查集。
日常抄代码。
太强啦。
想起了当初那道LLJ跑spfa过的题。
orz sxy llj大佬
//Twenty
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<queue>
#include<vector>
const int maxn=1000+299;
int flag,T,n,m,x,y,z,f[maxn],v[maxn];
using namespace std;
int find(int x) {
if(x==f[x]) return x;
else {
int tp=find(f[x]);
v[x]+=v[f[x]];
f[x]=tp;
return tp;
}
}
void add(int x,int y,int z) {
int p=find(x),q=find(y);
if(p!=q) {
f[p]=q;
v[p]=v[y]-v[x]-z;
}
else {
if(v[y]-v[x]!=z) flag=1;
}
}
int main() {
scanf("%d",&T);
while(T--) {
scanf("%d%d",&n,&m);
for(int i=0;i<=n;i++) f[i]=i,v[i]=0;
flag=0;
for(int i=1;i<=m;i++) {
scanf("%d%d%d",&x,&y,&z);
if(!flag) add(x-1,y,z);
}
if(flag) printf("false\n");
else printf("true\n");
}
return 0;
}