题目:大学的同学来自全国各地,对于远离家乡步入陌生大学校园的大一新生来说,碰到老乡是多么激动的一件事,于是大家都热衷于问身边的同学是否与自己同乡。来自新疆的小鲵尤其热衷。但是大家都不告诉小尼他们来自哪里,只是说与谁同乡。从所给的信息中,你能告诉小尼有多少人确定是她的同乡么?
输入:每个测试实例首先包括两个整数,N(1 = < N < = 1000),M(0 = < M < = N*(N-1)/2),代表现在有N个人(用1~N编号)和M组关系;
在接下来的M行里,每行包括两个整数,a,b,代表a跟b是同乡;
当N=0,M=0输入结束;
已知1表示小尼本人。
输出: 对于每个测试实例,输出一个整数,代表确定是小尼同乡的人数。
方法:两种方法,图的遍历和并查集,本文为并查集解法。
代码:
#include <iostream>
#include <stdlib.h>
using namespace std;
class CheckSet
{
private:
int data[1000];
int size;
public:
CheckSet()
{
size = 1000;
for (int i = 0; i < 1000; ++i)
data[i] = i;
}
CheckSet(int n)
{
for (int i = 0; i <=n; ++i)
data[i] = i;
size = n;
}
int find(int x)
{
return data[x];
}
void join(int x, int y)
{
int fx = find(x), fy = find(y);
if (fx != fy)
{
for (int i = 0; i <= size; ++i)
if (data[i] == fx) data[i] = fy;
}
}
};
int main(int argc, char *argv[])
{
int num, relation, a, b;
cin >> num >> relation;
CheckSet friendship(num+1);
for (int i = 0; i < relation; ++i)
{
cin >> a >> b;
friendship.join(a, b);
}
int ans = 0;
int pos= friendship.find(1);
for (int i = 0; i <= num; ++i)
{
if (friendship.find(i) == pos) ans++;
}
cout << ans-1<<endl;
}
测试结果: