思路:
注意没有点的情况输出Yes,每输入两个点就合并,如果父节点相同即有环
最后判断出现的点是不是只有一个父节点,如果只有一个父节点输出Yes
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <cmath>
using namespace std;
int Father[100000+100],vis[100000+100];
void init()
{
for (int i = 1; i <= 100000; i++)
{
Father[i]=i;
vis[i]=0;
}
}
int Find(int x)
{
while (Father[x]!=x)
x = Father[x];
return x;
}
int main(void)
{
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
int flag;
int x, y;
while (scanf("%d %d", &x, &y))
{
flag = 1;
if (x==-1 && y==-1)
{
break;
}
if (x==0 && y==0)
{
printf("Yes\n");
continue;
}
init();
vis[x] = 1;
vis[y] = 1;
x = Find(x);
y = Find(y);
if (x==y)
flag = 0;
else
Father[x] = y;
while (scanf("%d %d", &x, &y))
{
if (x==0 && y==0)
break;
vis[x] = 1;
vis[y] = 1;
x = Find(x);
y = Find(y);
if (x==y)
flag = 0;
else
Father[x] = y;
}
int l = 0;
int ans = 0;
for (int i =1 ; i <= 100000; i++)
{
if (Father[i]==i && vis[i]==1)
l++;
if (l>1)
flag = 0;
}
printf("%s\n",flag==1?"Yes":"No");
}
return 0;
}