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