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 }

这好像是一个差分约束,用前缀和数组与读入的条件建边,发现所有的条件都是等于,所以可以用并查集维护,维护到祖先节点的距离。

posted on 2016-03-03 23:02  xiyuedong  阅读(143)  评论(0编辑  收藏  举报