POJ 2524 Ubiquitous Religions(并查集)

Description
已知有n个大学生,其中有m对宗教信仰相同的学生,请你估算这n个学生中最多有多少种宗教信仰
Input
第一行为两个整数n和m表示大学生人数和有相同信仰的学生对数,之后m行每行两个整数a和b表示学生a和学生b有相同的宗教信仰(0 < n <= 50000,0<=m<=n*(n-1)/2)
Output
输出这n名学生最多有多少种宗教信仰
Sample Input
10 9
1 2
1 3
1 4
1 5
1 6
1 7
1 8
1 9
1 10
10 4
2 3
4 5
4 8
5 8
0 0
Sample Output
Case 1: 1
Case 2: 7
Solution
并查集,初始状态每个人都是一个集合,每次合并具有相同信仰的两人所处的集合,最后记录有多少不同的集合即可
Code

#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
#define maxn 55555 
int par[maxn];
int deep[maxn];
void init(int n) 
{
    for(int i=0;i<n;i++)
    {
        par[i]=i;
        deep[i]=0;
    }
} 
int find(int x)
{
    if(par[x]==x) return x;
    else return par[x]=find(par[x]);
}
void unite(int x,int y)
{
    x=find(x);
    y=find(y);
    if(x==y) return;
    if(deep[x]<deep[y]) par[x]=y;
    else
    { 
        par[y]=x;
        if(deep[x]==deep[y]) deep[x]++;
    } 
}
int main()
{
    int n,m,x,y,ans,res=1;
    while(~scanf("%d%d",&n,&m),n||m)
    {
        init(n+1);
        while(m--)
        {
            scanf("%d%d",&x,&y);
            unite(x,y);
        }
        ans=0;
        for(int i=1;i<=n;i++)
            if(i==par[i])ans++;
        printf("Case %d: %d\n",res++,ans);
    }
    return 0;
}

你可能感兴趣的:(POJ 2524 Ubiquitous Religions(并查集))