并查集的应用,用来查找被分割的区域个数。
即当两个节点值相同时说明已经为了一个圈,否则不可能,此时区域个数加1.
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 using namespace std; 5 const int maxn=1010; 6 int n,m; 7 int root[maxn]; 8 9 int find(int a){ 10 while(root[a]!=a){ 11 a=root[a]; 12 } 13 return a; 14 } 15 16 int main(){ 17 while(EOF != scanf("%d%d",&n,&m)){ 18 for(int i=0;i<n;i++){ 19 root[i]=i; 20 } 21 int ans = 0; 22 int a,b; 23 while(m--){ 24 scanf("%d%d",&a,&b); 25 int ra=find(a); 26 int rb=find(b); 27 if(ra == rb) 28 ans++; 29 else 30 root[ra]=rb;//epual to Join 31 //printf("%d %d %d\n",ra,rb,ans); 32 } 33 printf("%d\n",ans); 34 } 35 return 0; 36 }
8 10 0 1 1 2 1 3 2 4 3 4 0 5 5 6 6 7 3 6 4 7
3
原文:http://www.cnblogs.com/wushuaiyi/p/3647206.html