当前位置: 代码迷 >> 综合 >> POJ2524-并查集
  详细解决方案

POJ2524-并查集

热度:42   发布时间:2024-01-18 01:06:12.0

题意:给出一些在一个集合的元素信息,求一共有多少个无交集的集合

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

#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;
}