整个文件以两个-1结尾。
//虽然这题A了,但是感觉这题目还是有些问题,按题意来说应该是无向的、可是我用树根来做的话明显是有向的,即 7 5 和5 7是不一样的
//如果我把第二组数据改成 1 8 8 7 8 9 5 7 4 7 6 7 3 7 2 6 0 0 这个图是一样的,但是我的代码运行是No,明显错了,这题明显不是并查集解的。
//正确的方法应该是 拓扑排序加上dfs算连通分支
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
#define N 100003
int v[N];
int f[N];
bool hash[N];
int main()
{
int n,m,nt,i,t;
bool flag;
while(scanf("%d%d",&n,&m))
{
if(n==-1&&m==-1)
break;
memset(v,0,sizeof(v));t=1;
memset(f,0,sizeof(f));nt=0;
memset(hash,0,sizeof(hash));
if(!hash[n]) {hash[n]=1;nt++;}
if(!hash[m]) {hash[m]=1;nt++;}
f[m]=n;flag=1;
if(m!=n)
{v[m]=n;t++;}
if(n||m)
while(scanf("%d%d",&n,&m),n||m)
{
if(!flag)
continue;
if(f[m]&&n!=f[m])//判断一个节点是否有多个父节点,我把这句丢了还是AC,明显这题的数据很水,出题的本意应该是并查集
{ flag=0; continue;}
if(!hash[n]) {hash[n]=1;nt++;}
if(!hash[m]) {hash[m]=1;nt++;}
f[m]=n;
while(v[n]>0)
n=v[n];
while(v[m]>0)
m=v[m];
if(m==n)
{flag=0; continue;}
v[m]=n;t++;
}
if(nt!=t)
flag=0;
if(flag)
printf("Yes\n");
else
printf("No\n");
}
return 0;
}