SDUT (并查集)

来源:互联网 发布:mac开机出现禁止符号 编辑:程序博客网 时间:2024/06/05 06:52


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 20 11 25 21 22 3

示例输出

20

提示

 
#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;}


0 0
原创粉丝点击