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 }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值