题目描述
大学的同学来自全国各地,对于远离家乡步入陌生大学校园的大一新生来说,碰到老乡是多么激动的一件事,于是大家都热衷于问身边的同学是否与自己同乡,来自新疆的小赛尤其热衷。但是大家都不告诉小赛他们来自哪里,只是说与谁同乡,从所给的信息中,你能告诉小赛有多少人确定是她的同乡吗?
输入
每个测试实例首先包括2个整数,N(1 <= N <= 1000),M(0 <= M <= N*(N-1)/2),代表现有N个人(用1~N编号)和M组关系; 在接下来的M行里,每行包括2个整数,a,b,代表a跟b是同乡; 当N = 0,M = 0输入结束; 已知1表示小赛本人。
| 样例输入3 1 2 3 5 4 1 2 3 4 2 5 3 2 0 0 |
输出
对于每个测试实例,输出一个整数,代表确定是小赛同乡的人数。
| 样例输出
0 4
|
时间限制C/C++语言:1000MS其它语言:3000MS | 内存限制C/C++语言:65536KB其它语言:589824KB |
#include <iostream>//并查集简单应用
using namespace std;
#define N 1001
int n,m;
int pa[N];
void makeset(int n)
{
for(int i=1;i<=n;++i)
pa[i]=i;
}
int findset(int x)
{
if(x!=pa[x])
pa[x]= findset(pa[x]);
return pa[x];
}
void unionset(int x,int y)
{
x = findset(x);
y = findset(y);
if(x == y)
return ;
pa[x] = y;
}
int main()
{
int n,m,a,b,i;
while(cin>>n>>m)
{
if(n==0&&m==0)
break;
makeset(n);
for(int i=0;i<m;++i)
{
cin>>a>>b;
a=findset(a);
b=findset(b);
unionset(a,b);
}
int cnt=0;
int result=findset(1);
for(int i=2;i<=n;++i)
{
if(findset(i)==result)
++cnt;
}
cout << cnt<< endl;
}
return 0;
}
#include<iostream>
using namespace std;
int main()
{
int n,m;
while(cin>>n>>m)
{
if(n==0&&m==0)
break;
int *p=new int[n+1];
for(int i=0;i<=n;i++)
p[i]=i;
for(int i=0;i<m;i++)
{
int a,b;
cin>>a>>b;
if(p[a]!=p[b])
{
for(int j=0;j<=n;j++)
{
if(p[j]==p[a]&&j!=a)
p[j]=p[b];
}
p[a]=p[b];
}
}
int count=0;
for(int i=0;i<=n;i++)
if(p[i]==p[1])
count++;
cout<<count-1<<endl;
}
}