hdu1232 畅通工程

只要最后统计出有多少个集合就好了

我用并查集还有set做的,好像用set慢了一点

#include<stdio.h>
#include<set>
using namespace std;
int f[1010];
int find(int x)
{
	if(x==f[x])
		return 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)
		return ;
	f[a]=b;
	return ;
}
int main()
{
	int n,m,i;
	int a,b;
	while(scanf("%d",&n)&&n)
	{
		scanf("%d",&m);
		for(i=1;i<=n;i++)
			f[i]=i;
		for(i=1;i<=m;i++)
		{
			scanf("%d %d",&a,&b);
			Union(a,b);
		}
		set<int> s;
		for(i=1;i<=n;i++)
		{
			s.insert(find(i));
		}
		printf("%d\n",s.size()-1);
	}
	return 0;
}
posted @ 2011-05-20 22:25  枕边梦  阅读(169)  评论(1编辑  收藏  举报