题意:判断图中任意两点之间是否有且仅有一条路相通
分析:因为有且仅有一条路相通,则图中不能形成环,且有且仅有一个公共祖先
#include<stdio.h>
#define N 100000
int f[N+10],t[N+10];
int find(int a)
{
if(a!=f[a])
a=find(f[a]);
return a;
}
int mix(int a,int b) //因为a,b连通,若a,b的祖先相同,则形成了环
{
int x,y;
x=find(a);
y=find(b);
if(x==y)
return 0;
f[x]=y;
return 1;
}
int main()
{
int i,n,m,a,b,flag;
while(scanf("%d%d",&m,&n)!=EOF){
if(m==-1&&n==-1)
break;
if(m==0&&n==0){
printf("Yes\n");
continue;
}
for(i=1;i<=N;i++){
f[i]=i;
t[i]=0;
}
flag=1;
while(m!=0&&n!=0){
t[m]=t[n]=1; //因为给的序号不一定连续,要标记一下
a=mix(m,n);
if(!a)
flag=0;
scanf("%d%d",&m,&n);
}
if(flag){
b=0;
for(i=1;i<=N;i++)
if(t[i]&&f[i]==i)
b++; //计算祖先的个数,若大于1,则属于不同祖先的点不连通
}
if(flag&&b==1)
printf("Yes\n");
else
printf("No\n");
}
return 0;
}