您的位置:首页 > 其它

SDUT (并查集)

2014-08-14 21:29 155 查看






Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^



题目描述

众所周知,考试有几套不同的试卷,而且,为了防止我们抄袭旁边同学的,一般附近同学的试卷和你的试卷不一样。但是,我们还是知道了一些同学的试卷是相同的,假设有n个同学,编号为0~n-1,你的编号为0,,根据我们已知的信息,求还有多少人的试卷和你的试卷是相同的。


输入

多组输入,每组第一行,有两个整数n,m(2 <= n <= 100000, 0 <= m <= 10000),代表n个同学,m条我们已知的信息。
接下来m行,每行有两个整数a,b(0 <= a,b <= n-1)。
代表a同学和b同学的试卷是相同的。


输出

每组输出一行,输出和你的试卷相同的同学的个数。


示例输入

5 2
0 1
1 2
5 2
1 2
2 3



示例输出

2
0



提示

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int fa[1000010];
void Make_set(int n)
{
	for(int i=0;i<n;i++)
		fa[i]=i;
}
int Find(int x)
{
	if(x!=fa[x])
	fa[x]=Find(fa[x]);
	return fa[x];
}
void Union(int x,int y)
{
	int fx=Find(x);
	int fy=Find(y);
	if(fx!=fy)
		fa[fy]=fx;
}
int main()
{
	int n,m,x,y;
	while(scanf("%d%d",&n,&m)!=EOF)
	{
		Make_set(n);
		while(m--)
		{
			scanf("%d%d",&x,&y);
			Union(x,y);
		}
		int cnt=0;
		for(int i=1;i<n;i++)
			if(Find(0)==Find(i))
			cnt++;
		printf("%d\n",cnt);
	}
	return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: