POJ 2524 Ubiquitous Religions 【并查集】

解题思路:输入总人数 n,和m组数据;即和杭电畅通工程相类似,对这m组数据做合并操作后,求最后一共有多少块区域。

#include<stdio.h>
int pre[50001];
int find(int root)
{
	if(root!=pre[root])
		pre[root]=find(pre[root]);
	return pre[root];
}
void unionroot(int x,int y)
{
	int root1,root2;
	root1=find(x);
	root2=find(y);
	if(x!=y)
	{
		pre[root1]=root2;
	}

}

int main()
{
	int n;
	int i;
	int x,y;
	long int m;
	int tag=1;
	while(scanf("%d %d",&n,&m)!=EOF&&(n||m))
	{
		int sum=0;
		
		for(i=0;i<n;i++)
			pre[i]=i;
		while(m--)
		{
		scanf("%d %d",&x,&y);
		unionroot(x,y);
		}
		for(i=0;i<n;i++)
		{
			if(find(i)==i)
				sum++;
		}
		printf("Case %d: %d
",tag,sum);
		tag++;

	}
}
原文地址:https://www.cnblogs.com/wuyuewoniu/p/4129173.html