pku2524(Ubiquitous Religions)

这道题一开始的思路不过严谨,忽略 了一种情况,悲剧,本想一次过的

这题不难,跟前面的某一到题目类似,不过不是求集合的元素个数,而是求有多少个集合

具体思路很简单,在代码中……

#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;
}
原文地址:https://www.cnblogs.com/nanke/p/2038726.html