题解:判断是否构成一棵树,可以用DFS也可以用并查集,这里用并查集做
注意一开始就输入0 0的情况为空树,也是Yes
代码:
#include <bits/stdc++.h>
using namespace std;
int const N = 100000 + 10;
int fa[N],vis[N];
bool ans;
void Init(){
for(int i=0;i<N;i++) fa[i] = i,vis[i] = false;
ans = true;
}
int find(int x){
return x == fa[x] ? x : (fa[x] = find(fa[x]));
}
void Union(int x,int y){
vis[x] = vis[y] = true;
int px = find(x), py = find(y);
if(px != py)
fa[px] = py;
else ans = false;
}
int main(){
int x,y;
Init();
while(cin>>x>>y){
if(!x && !y){
cout<<"Yes"<<endl;
continue;
}
if(x == -1 && y == -1) return 0;
Union(x,y);
while(cin>>x>>y){
if(!x && !y) break;
Union(x,y);
}
bool first = true;
int top;
for(int i=1;i<N;i++){
if(vis[i]){
if(first){
top = find(i);
first = false;
}else{
if(find(i) != top)
ans = false;
}
}
}
if(ans) cout<<"Yes"<<endl;
else cout<<"No"<<endl;
Init();
}
}