题意:
学校里的学生有很多信仰,你要知道学校里最多有多少种信仰,但是你不能去问每一个学生,你只能问两个学生他们的信仰是否一样
输入有多组样例
每组样例的第一行是n和m,n是学生数,从1,到n编号,接下来m行a和b,表示
a和b的信仰相同
当n和m为0的时候,输入停止
解法:
并查集
#include<iostream>
#include<algorithm>
#include<cstdio>
using namespace std;
int parent[50100];
int root(int i)
{
if(parent[i]==i)
{
return i;
}
return parent[i]=root(parent[i]);
}
void Merge(int a,int b)
{
int ra=root(a);
int rb=root(b);
parent[ra]=rb;
}
int main()
{
int n,m;
int kk=1;
while(scanf("%d %d",&n,&m),n||m)
{
for(int i=1;i<=n;i++)
{
parent[i]=i;
}
int a,b;
while(m--)
{
scanf("%d %d",&a,&b);
Merge(a,b);
}
int counter=0;
for(int i=1;i<=n;i++)
{
if(parent[i]==i)
{
counter++;
}
}
printf("Case %d: %d\n",kk++,counter);
}
return 0;
}