题目链接: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;
}