http://acm.hdu.edu.cn/showproblem.php?pid=1232
完全就是并查集的应用啊。。。
View Code
1 #include<iostream> 2 const int N=1010; 3 using namespace std; 4 5 int n,m; 6 int parent[N]; 7 8 //初始化 9 void UFset(){ 10 for(int i=1;i<=n;i++){ 11 parent[i]=-1; 12 } 13 } 14 //找根结点 15 int Find(int x){ 16 int s; 17 for(s=x;parent[s]>=0;s=parent[s]); 18 //优化 19 while(s!=x){ 20 int temp=parent[x]; 21 parent[x]=s; 22 x=temp; 23 } 24 return s; 25 } 26 //合并 27 void Union(int R1,int R2){ 28 int r1=Find(R1); 29 int r2=Find(R2); 30 int temp=parent[r1]+parent[r2]; 31 if(parent[r1]>parent[r2]){ 32 parent[r1]=r2; 33 parent[r2]=temp; 34 }else { 35 parent[r2]=r1; 36 parent[r1]=temp; 37 } 38 } 39 40 int main(){ 41 while(scanf("%d%d",&n,&m)!=EOF){ 42 if(n==0)break; 43 int x,y,ans=n-1; 44 UFset(); 45 for(int i=1;i<=m;i++){ 46 scanf("%d%d",&x,&y); 47 if(Find(x)!=Find(y)){ 48 Union(x,y); 49 ans--; 50 } 51 } 52 printf("%d\n",ans); 53 } 54 return 0; 55 }