题意:给出一些在一个集合的元素信息,求一共有多少个无交集的集合
题解:并查集,初始集合个数为人数,在合并集合的过程中,每次在一个集合里合并了一个人,集合个数就减一
#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;
}