题目大意:大学的同学来自全国各地,对于原理家乡步入陌生大学校园的大一新生来说,碰到老乡是多么激动的一件事,于是大家都热衷于问身边的同学是否与自己同乡,来自新疆的小尼尤其热衷。但是大家都不告诉他来自哪里,只是说与谁同乡。从所给的信息中,你能告诉小尼有多少确定是他的同乡吗?
输入:第一行 包含两个整数N(1<=N<=1000),M(0<=M<=N*(N-1)/2),代表有N个人(用1-N编号)和M组关系:在接下来的M行里,每行包括2个整数。如 2 3 代表 2号和3号是同乡。当N=0、M=0表示输入结束;已知1表示小尼本人。
输出:对于每个测试实例,输出一个整数,代表确定是小尼同乡的人数。
样例输入:
3 1
2 3
5 4
1 2
3 4
2 5
3 2
0 0
样例输出:
0
4
并查集实现代码如下:
#include<iostream>
using namespace std;
int findSet[1001]; //并查集
int find( int y) //查找
{
return findSet[y] == y ? y : find( findSet[y]);
}
int main()
{
int n, m,buf1,buf2,k;
while (1)
{
cin >> n >> m;
if (n == 0 && m == 0)
break;
for (int i = n; i > 0; --i)
findSet[i] = i;
while (m--)
{
cin >> buf1 >> buf2;
while(findSet[buf1]!=buf1)
{
buf1=findSet[buf1];
if(buf1==buf2) break;
}
if(buf1!=buf2) //含路径压缩
findSet[buf1]=buf2;
}
k = find(findSet[1]);
buf1 = 0; //计数
for (int i = n; i > 1; --i)
{
if (k == find(findSet[i]))
buf1++;
}