题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=66964#problem/M
题目大意:中文题目
解题思路:给你一个图,让你判断是不是树,并查集即可。注意本题读入方式,我WA了无数次,有两个原因,一是要判断是否只有一棵树,而是数据中有上来就0 0的要特判。
代码:
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<algorithm>
using namespace std;
const int maxn=100005;
int fa[maxn];
bool vis[maxn];
int find(int x){
if(fa[x]==x) return x;
return fa[x]=find(fa[x]);
}
int a,b;
int main(){
while(scanf("%d%d",&a,&b)==2){
bool can=0;
if(a==-1&&b==-1) break;
if(a==0&&b==0){
cout<<"Yes"<<endl; continue;
}
for(int i=1;i<maxn;i++){
fa[i]=i;
vis[i]=0;
}
fa[find(a)]=find(b);
vis[a]=1;vis[b]=1;
while(scanf("%d%d",&a,&b)==2){
if(a==0&&b==0) break;
vis[a]=1;vis[b]=1;
if(find(a)==find(b)) can=1;
else fa[find(a)]=find(b);
}
int cnt=0;
if(can){
cout<<"No"<<endl; continue;
}
else for(int i=1;i<maxn;i++){
if(vis[i]&&fa[i]==i) cnt++;
}
if(cnt>1){
cout<<"No"<<endl; continue;
}
cout<<"Yes"<<endl;
}
return 0;
}

本文介绍了一个使用并查集算法判断给定图是否构成一棵树的问题解决方法。通过对输入数据进行特殊处理和利用并查集进行节点连接状态的判断,确保了正确性和效率。
4146

被折叠的 条评论
为什么被折叠?



