描述
五一快到咯,大家都在计划着去哪里玩。EE呢,也在计划着出去玩,听说欧洲很浪漫,他就想趁这几天去欧洲几个国家玩玩。但是呢,有一个问题就是,他不知道他的钱在他想去的几个国家是否可以用。请你帮他判定一下他是否决定要不要去这几个国家旅游(假设两个国家的货币可以相互兑换,则表示他的钱可以在这两个国家使用)
输入
输入包括多组数据,每组数据第一行是两个数N,M(代表他一共想去N个国家,其中有M种兑换方式,(1<=N<=10,0<=M<=20),接下来的M行,每行输入2个数据,a,b,代表a,b两国之间的货币可以相互兑换。0代表的是EE所在的国家。
输出
EE是否可以去他想去的这几个国家旅游,如果可以,则输出yes!,否则输出sorry!。每个输出占一行。
样例输入
3 4
0 3
1 2
2 3
0 1
样例输出
yes!
#include <iostream>
using namespace std;
#define N 12
int city[N];
int findfather(int n){ //寻找根节点
if (city[n]!=n)
city[n]=findfather(city[n]);
return city[n];
}
//注意各循环中如果没有等号,这个题过不去。。
int main(){
int n,m,a,b,i;
int count[N],sum;
while (cin>>n>>m){
sum=0;
for (i=0;i<=n;i++) //①初始化数组,及当city[i]=i时,为根节点。
city[i]=i;
memset(count,0,sizeof(count));
while (m--){
cin>>a>>b;
a=findfather(a); //②寻找根节点
b=findfather(b);
if (a!=b) //③合并
city[b]=a;
}
for (i=0;i<=n;i++)
count[findfather(i)]=1;
for (i=0;i<=n;i++)
if (count[i]==1)
sum++;
if (sum==1)
cout<<"yes!"<<endl;
else cout<<"sorry!"<<endl;
}
return 0;
}
。。不管怎样,还是要记录一下并查集的问题。
①初始化
②递归寻找父节点
③合并