hdu 3038 并查集

题意:给出多个区间的和,判断数据矛盾的区间有几个,比方说【1,5】 = 10 ,【6.10】 

= 10, 【1, 10】 = 30,这明显第三个与前面两个矛盾。

链接:点我

水题了,val代表到根的和

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<algorithm>
 4 #include<cstring>
 5 #include<cmath>
 6 #include<queue>
 7 #include<map>
 8 using namespace std;
 9 #define MOD 1000000007
10 const int INF=0x3f3f3f3f;
11 const double eps=1e-5;
12 typedef long long ll;
13 #define cl(a) memset(a,0,sizeof(a))
14 #define ts printf("*****\n");
15 const int MAXN=200010;
16 int n,m,tt;
17 int ans=0;
18 int f[MAXN];
19 int val[MAXN];
20 int find(int x)
21 {
22     if(f[x]==-1)    return x;
23     int temp=find(f[x]);
24     val[x]+=val[f[x]];
25     return f[x]=temp;
26 }
27 void bing(int x,int y,int w)
28 {
29     int t1=find(x);
30     int t2=find(y);
31     if(t1!=t2)
32     {
33         f[t2]=t1;
34         val[t2]=val[x]-val[y]+w;
35     }
36     else
37     {
38         if(val[y]-val[x]!=w)
39         {
40             ans++;
41         }
42     }
43 }
44 int main()
45 {
46     int i,j,k;
47     #ifndef ONLINE_JUDGE
48     freopen("1.in","r",stdin);
49     #endif
50     while(scanf("%d%d",&n,&m)!=EOF)
51     {
52         memset(f,-1,sizeof(f));
53         memset(val,0,sizeof(val));
54         ans=0;
55         int u,v,w;
56         for(i=0;i<m;i++)
57         {
58             scanf("%d%d%d",&u,&v,&w);
59             u-=1;
60             bing(u,v,w);
61         }
62         printf("%d\n",ans);
63     }
64 }

 

posted @ 2015-05-08 11:04  miao_a_miao  阅读(169)  评论(0编辑  收藏  举报