链接:http://acm.hdu.edu.cn/showproblem.php?pid=1272
2个条件:
1,用并查集判断是否有环.
2, 在一根树中.
AC code:
#include <iostream>
using namespace std;
#define NUM 100002
int father[NUM],num[NUM];
void Init()
{
for(int i=0;i<NUM;++i)
{
father[i]=i;
num[i]=0;
}
}
int FindFather(int n)
{
while (n!=father[n])
{
n=father[n];
}
return n;
}
bool Union(int a,int b)
{
int x,y;
x=FindFather(a);
y=FindFather(b);
if(x==y) return false;
num[a]=num[b]=1;
if(num[y]<=num[x])
{
father[y]=x;
}
return true;
}
int main()
{
int a,b,i,flag=1,temp,sum,flag2;
while(1)
{
sum=0;
Init();
flag=1;
flag2=1;
i=0;
while(1)
{
i++;
cin>>a>>b;
if(a==-1&&b==-1) return 0;
if(a==0&&b==0) { break;}
temp=Union(a,b);
if(!temp) flag=temp;
}
for(i=1;i<NUM;++i)
if(num[i]&&i==father[i]) sum++;
if(sum>1) flag2=0;
if(flag&&flag2) cout<<"Yes"<<endl;
else cout<<"No"<<endl;
// cout<<endl;
}
}