hdu 1232 经典并查集应用

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 }

 

posted @ 2013-02-02 21:23  ihge2k  阅读(198)  评论(0编辑  收藏  举报