poj 1611The Suspects(并查集)

本文详细介绍了并查集算法的实现细节,通过一个具体的POJ题目进行实例讲解。使用了rank数组来记录与根节点的关系,并用num数组记录树的节点数。文中还提供了完整的C++代码实现。

题目:http://poj.org/problem?id=1611

并查集问题,rank[]记录与根节点的关系,num[]记录树的节点数

View Code
 1 #include <iostream>
 2 #include<cstdio>
 3 
 4 using namespace std;
 5 int set[30010];
 6 int rank[30010];
 7 int num[30010];
 8 int find(int x)
 9 {
10     if(x!=set[x])
11     {
12         set[x]=find(set[x]);
13     }
14     return set[x];
15 }
16 void merge(int a,int b)
17 {
18     a=find(a);
19     b=find(b);
20     if(a==b)
21     {
22         return ;
23     }
24     if(rank[a]>rank[b])
25     {
26         set[b]=a;
27         num[a]+=num[b];
28     }
29     else
30     {
31         set[a]=b;
32         if(rank[a]==rank[b])
33         {
34             rank[a]++;
35             num[b]+=num[a];
36         }
37     }
38     return ;
39 }
40 int main()
41 {
42     int n,m;
43     while(scanf("%d%d",&n,&m)!=EOF)
44     {
45         if(n==0&&m==0)
46         break;
47         int t;
48         int i,j;
49         int a,b;
50         for(i=0;i<n;i++)
51         {
52             set[i]=i;
53             rank[i]=0;
54             num[i]=1;
55         }
56         for(i=0;i<m;i++)
57         {
58             cin>>t;
59             cin>>a;
60             for(j=1;j<t;j++)
61             {
62                 cin>>b;
63                 a=find(a);
64                 b=find(b);
65                 merge(a,b);
66             }
67         }
68         cout<<num[find(0)]<<endl;
69     }
70     return 0;
71 }

 

转载于:https://www.cnblogs.com/wanglin2011/archive/2013/01/18/2866940.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值