还是那句话,注意方向。
#include<cstdio>
#include<cstring>
int fa[101],d[101];
int find(int x){
if(x==fa[x]) return x;
int xx=find(fa[x]);
d[x]+=d[fa[x]];
return fa[x]=xx;
}
//边都指向小的数。d[x]表示fa[x]+1...x的和
int main(){
// freopen("a.in","r",stdin);
int w;
scanf("%d",&w);
while(w--){
int n,m;
scanf("%d%d",&n,&m);
for(int i=0;i<=n;++i) fa[i]=i;
memset(d,0,sizeof(d));
//注意初始化数组~
bool flag=1;
while(m--){
int s,t,v;
scanf("%d%d%d",&s,&t,&v);
s--;
int xx=find(s),yy=find(t);
if(xx!=yy) fa[yy]=xx,d[yy]=d[s]+v-d[t];
//d[yy]表示yy指向xx的边,即xx+1月到yy月的和。画向量图推。
else if(d[t]-d[s]!=v){
flag=0;break;
}
}
if(flag) puts("true");
else puts("false");
}
return 0;
}