您的位置:首页 > 其它

POJ2524->并查集

2016-07-25 17:30 381 查看
题意:给出一些在一个集合的元素信息,求一共有多少个无交集的集合

题解:并查集,初始集合个数为人数,在合并集合的过程中,每次在一个集合里合并了一个人,集合个数就减一

#include <stdio.h>
#include <iostream>
using namespace std ;
#define MAX 50005
int parent[MAX] ;
int rank[MAX] ;
int num[MAX] ;
int cnt ;
void make_set(int x)
{
parent[x] = x ;
rank[x] = 0 ;
num[x] = 1 ;
}
int find_set(int x)//查找x的根节点
{
int r = x , temp ;
while(parent[r] != r) r = parent[r] ;
while(x != r)
{
temp = parent[x] ;
parent[x] = r ;
x = temp ;
}
return x ;
}
void union_set(int x , int y)//合并两个集合
{
x = find_set(x) ;
y = find_set(y) ;
if(x == y) return ;
if(rank[x] > rank[y])
{
parent[y] = x ;
num[x] += num[y] ;
}
else
{
parent[x] = y ;
if(rank[x] == rank[y]) rank[y] ++ ;
num[y] += num[x] ;
}
cnt -- ;
}
int main(int argc, char const *argv[])
{
int n , m , T = 1;
while(scanf("%d%d" , &n , &m)!=EOF , m+n)
{
for(int i = 0 ; i <= n ; i ++) make_set(i) ;
int a , b ;
cnt = n ;
for(int i = 1 ; i <=m ; i ++)
{
scanf("%d%d", &a , &b) ;
union_set(a , b) ;
}
printf("Case %d: %d\n", T++ , cnt);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: