![](https://www.evernote.com/shard/s243/res/794f2bde-9279-4a21-ae7a-b14d77167e54.jpg?resizeSmall&width=721)
整个文件以两个-1结尾。
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<stdlib.h>
#include<math.h>
#include<algorithm>
#pragma comment(linker,"/STACK:102400000,102400000")
using namespace std;
int father[100010];
int find(int x)
{
while(x!=father[x])
{
x=father[x];
}
return x;
}
int main()
{
int x,y,i,sign,min,max,visit[100010];
while(scanf("%d%d",&x,&y),x!=-1||y!=-1)
{
if(x==0&&y==0)
{
printf("Yes\n");
continue;
}
memset(visit,0,sizeof(visit));//vis[i]标志输入出现的点
visit[x]=visit[y]=1;
for(i=0;i<100010;i++)
father[i]=i;//初始化
sign=0;
father[find(x)]=find(y);//以上是处理第一组数据
while(scanf("%d%d",&x,&y),x||y)
{
visit[x]=visit[y]=1;
if(find(x)==find(y))
sign=1;//如果有共同的根节点,则不符合题意
else
father[find(x)]=find(y);//合并集合
}
if(sign)
{
printf("No\n");
continue;
}
int count=0;
for(i=1;i<=100010;i++)
{
if(visit[i]&&father[i]==i)
count++;
}
if(count==1)//判断父节点是否只有一个
printf("Yes\n");
else
printf("No\n");
}
return 0;
}