版权声明:转就转吧~~记得声明噢~~ https://blog.csdn.net/Soul_97/article/details/82804125
http://acm.hdu.edu.cn/showproblem.php?pid=1272
1. 合并两个点是判环 , 如果未发生合并,则说明父点是一样的,成环,
2. 判断根节点只有一个
#include <bits/stdc++.h>
using namespace std;
const int INF = 0x3f3f3f3f;
const int N = 1e5 + 5;
const int M = 5e5 + 5;
int fa[N],root[N];
bool circle;
int Find(int k){
while(k != fa[k])
k = fa[k];
return k;
}
void Merge(int x,int y){
int dx = Find(x);
int dy = Find(y);
if(dx != dy)
fa[dx] = dy;
else
circle = true;
}
int main()
{
int a, b;
while(cin >> a >> b && a != -1 && b != -1){
if(a == b && a == 0){
cout << "Yes" << endl;
continue;
}
for(int i = 0;i < N;i ++)
fa[i] = i, root[i] = 0;
root[a] = root[b] = 1;
Merge(a,b);
circle = false;
while(cin >> a >> b && a && b){
root[a] = root[b] = 1;
Merge(a,b);
}
int ans = 0;
for(int i = 1;i < N;i ++){
if(root[i] && fa[i] == i)
ans ++;
if(ans > 1){
circle = true;
break;
}
}
if(circle)
cout << "No" <<endl;
else
cout << "Yes" << endl;
}
return 0;
}