1 #include<cstdio> 2 #include<iostream> 3 #define M 1005 4 using namespace std; 5 int fa[M],T,n,m,v[M],kg; 6 int zhao(int a1) 7 { 8 if(fa[a1]==a1) 9 return a1; 10 int t=zhao(fa[a1]); 11 v[a1]+=v[fa[a1]]; 12 fa[a1]=t; 13 return t; 14 } 15 int main() 16 { 17 scanf("%d",&T); 18 for(;T;T--) 19 { 20 scanf("%d%d",&n,&m); 21 for(int i=0;i<=n;i++) 22 { 23 fa[i]=i; 24 v[i]=0; 25 } 26 kg=1; 27 for(int i=1;i<=m;i++) 28 { 29 int a1,a2,a3,x,y; 30 scanf("%d%d%d",&a1,&a2,&a3); 31 x=zhao(a1-1); 32 y=zhao(a2); 33 if(x!=y) 34 { 35 fa[y]=x; 36 v[y]=v[a1-1]+a3-v[a2]; 37 } 38 else if(v[a2]-v[a1-1]!=a3) 39 kg=0; 40 } 41 if(kg) 42 printf("true\n"); 43 else 44 printf("false\n"); 45 } 46 return 0; 47 }
这好像是一个差分约束,用前缀和数组与读入的条件建边,发现所有的条件都是等于,所以可以用并查集维护,维护到祖先节点的距离。