10 10 1 2 150 3 4 200 1 5 270 2 6 200 6 5 80 4 7 150 8 9 100 4 8 50 1 7 100 9 2 100
2分析:题意是按题目所诉A B X 就是把B放在A的位置编号+X处的位置,关键的一点就是明白如果find(A)!=find(B)则B的祖宗(find(B))的位置应为dis【A】+x-dis【B】,出现冲突的情况是当find(A)==find(B)时dis【B】!=dis【A】+x,这样就清楚了。
- #include<stdio.h>
- #include<string.h>
- #include<algorithm>
- #include<iostream>
- #define maxh 50000+10
- using namespace std;
- int set[maxh],dis[maxh];
- void init(int n)
- {
- for(int i=0;i<=n;i++)
- {
- set[i]=i;
- dis[i]=0;
- }
- }
- int findx(int x)
- {
- if(x==set[x])
- return set[x];
- int p=set[x];
- set[x]=findx(set[x]);
- dis[x]+=dis[p];
- return set[x];
- }
- bool uniom(int x,int y,int m)
- {
- int a=findx(x);
- int b=findx(y);
- if(a==b)
- {
- if(dis[x]+m!=dis[y])
- return false;
- return true;
- }
- else
- {
- set[b]=a;
- dis[b]=dis[x]+m-dis[y];
- return true;
- }
- }
- int main()
- {
- int n,m;
- int A,B,X;
- int ans;
- while(~scanf("%d%d",&n,&m))
- {
- init(n);
- ans=0;
- for(int i=0;i<m;i++)
- {
- scanf("%d%d%d",&A,&B,&X);
- if(!uniom(A,B,X))
- ans++;
- }
- printf("%d\n",ans);
- }
- return 0;
- }
原文:http://blog.csdn.net/letterwuyu/article/details/43451627