并查集(区间和的合理性判断)

http://acm.hdu.edu.cn/showproblem.php?pid=3038

 1 /*
 2 题意:
 3 对于特定的一个长n的数字序列,给出m个条件,形式为:a b sum意义如下
 4 [a,b]闭区间里的所有数字的和为sum
 5 问这m个条件中有多少不合理的。如
 6 1 5 10
 7 6 10 20
 8 1 10 20
 9 这3个条件中第三个为不合理的,因为由前两个的可以知道1 10为30
10 (注:先出现的视为合理,我们不说1 5 10不合理)
11 */
12 #include <iostream>
13 #include <cstdio>
14 #include <cstring>
15 using namespace std;
16 const int Ni = 200000+10;
17 int p[Ni];
18 int sum[Ni];
19 int finds(int i)
20 {
21     if(p[i]==i) return i;
22     int t=finds(p[i]);
23     sum[i]+=sum[p[i]];
24     return p[i]=t;
25 }
26 int main()
27 {
28     int n,m,i;
29     int a,b,ans;
30     int fa,fb,num;
31     while(~scanf("%d%d",&n,&m))
32     {
33         for(i=0;i<=n;i++) p[i]=i;
34         memset(sum,0,sizeof(int)*(n+2));
35         ans=0;
36         for(i=0;i<m;i++)
37         {
38            scanf("%d%d%d",&a,&b,&num);a--;
39            fa=finds(a);fb=finds(b);
40            if(fa==fb)
41            {
42                int temp=(sum[b]-sum[a]);
43                if(temp!=num) ans++;
44            }
45            else
46            {p[fb]=fa;sum[fb]=sum[a]-sum[b]+num;}
47         }
48         printf("%d\n",ans);
49     }
50     return 0;
51 }

 

10 5
1 10 100
7 10 28
1 3 32
4 6 41
6 6 1
10 3
1 10 20
1 10 30
1 10 30

 

ans:
1
2

 

posted @ 2012-07-24 15:52  qijinbiao1  阅读(355)  评论(0编辑  收藏  举报