代码实现
#include <cstdio>
const int maxn = 1010;
int father[maxn];
int n;
int m;
int find(int x){
if(father[x]==x){
return x;
}else{
int root = find(father[x]);
father[x]=root;
return root;
}
}
void Union(int u,int v){
int fatherU = find(u);
int fatherV = find(v);
if(fatherU!=fatherV){
father[fatherU] = fatherV;
}
return;
}
int main(){
while(scanf("%d",&n)!=EOF&&n!=0){
scanf("%d",&m);
for(int i=1;i<=n;i++){
father[i] = i;
}
while(m--){
int u,v;
scanf("%d %d",&u,&v);
Union(u,v);
}
int check=0;
for(int i=1;i<=n;i++){
if(find(i)==i){
check++;
}
}
if(check==1){
printf("YES\n");
}else{
printf("NO\n");
}
}
return 0;
}
码后反思
- 与之前不一样,我这里 使用父亲是否是自己来判断有多少个森林 ,嗯,这样挺妙的,使用了并查集的性质,赞!