这道题一开始的思路不过严谨,忽略 了一种情况,悲剧,本想一次过的
这题不难,跟前面的某一到题目类似,不过不是求集合的元素个数,而是求有多少个集合
具体思路很简单,在代码中……
#include<stdio.h>
#define MAXN 50010
int f[MAXN],r[MAXN],n,num;
int find(int x)
{
if(x!=f[x])
f[x]=find(f[x]);
return f[x];
}
void Union(int x,int y)
{
int a=find(x);
int b=find(y);
if(a==b)//若父节点相同,则表示都出现过了,不同,则表示有一个学生会被归入某一个集合中,所以num--;
return ;
num--;
if(r[a]>r[b])
{
f[b]=a;
}
else {
f[a]=b;
if(r[a]==r[b])
r[b]++;
}
}
int main()
{
int n,m,i,c=0,a,b;
while(scanf("%d %d",&n,&m)!=EOF &&(n||m))
{
num=n;
for(i=1;i<=n;i++)
{
f[i]=i;
r[i]=0;
}
for(i=1;i<=m;i++)
{
scanf("%d %d",&a,&b);
Union(a,b);
}
printf("Case %d: %d\n",++c,num);
}
return 0;
}