您的位置:首页 > 其它

hdu 1232 经典并查集应用

2014-05-26 17:51 239 查看
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
;
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 }


 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: