并查集(区间和的合理性判断)
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