维护到根节点的和,判断即可
初始化要到0。。。坑死我了
AC Code
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
int w;
int n,m;
int fa[1005];
int sum[1005];
int find(int x)
{
if(x==fa[x])return x;
int t=find(fa[x]);
sum[x]+=sum[fa[x]];
fa[x]=t;
return t;
}
int flag;
void add(int x,int y,int c)
{
int xa=find(x);
int ya=find(y);
if(xa==ya)
{
if(sum[y]-sum[x]!=c)flag=1;
}
else
{
fa[xa]=ya;
sum[xa]=sum[y]-sum[x]-c;
}
}
int main()
{
scanf("%d",&w);
while(w--)
{
scanf("%d%d",&n,&m);
memset(sum,0,sizeof(sum));
for(int i=0;i<=n;i++)
fa[i]=i;
flag=0;
int x,y,c;
while(m--)
{
scanf("%d%d%d",&x,&y,&c);
add(x-1,y,c);
}
if(!flag)printf("true\n");
else printf("false\n");
}
return 0;
}