本题关键一点在输入上,再之后就是再判断根节点是否有两个上,一般的条件是,如果两个父节点重复的话,则不满足情况,并且,在par数组上要初始化为0,对应的find函数也要改变
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn=100010;
int par[maxn],p[maxn],t[maxn];
int cnt,temp;bool flag;
int find(int x)
{
//cout<<"here"<<endl;
return par[x]==0?x:par[x]=find(par[x]);
}
void init()
{
cnt=temp=0;
memset(par,0,sizeof(par));
memset(p,0,sizeof(p));
flag=false;
}
int main()
{
int a,b;
//freopen("M.txt","r",stdin);
while(scanf("%d %d",&a,&b)!=EOF)
{
init();
if(a==-1&&b==-1)
break;
if(a==0&&b==0)
{
printf("Yes\n");continue;
}
par[a]=b;
if(!p[a])
{
p[a]=1;t[cnt++]=a;
}
if(!p[b])
{
p[b]=1;t[cnt++]=b;
}
while(scanf("%d %d",&a,&b)!=EOF)
{
if(a==0&&b==0)
{
break;
}
if(flag) continue;
int pa=find(a),pb=find(b);
if(pa==pb)
{
flag=true;
continue;
}
else
par[pa]=pb;
if(!p[a])//记录这个数出现了
{
p[a]=1;t[cnt++]=a;
}
if(!p[b])
{
p[b]=1;t[cnt++]=b;
}
}
if(!flag)//判断根节点是否有多个的情况
{
for(int i=0;i<cnt;i++)
{
if(!par[t[i]]) temp++;
}
if(temp>1) flag=true;
}
if(!flag) printf("Yes\n");
else printf("No\n");
}
return 0;
}