通过已给的路径判断每个顶点之间是否都能互相到达并且没有回路
#include<stdio.h>
#include<iostream>
using namespace std;
int f[100005];
int v[100005];
int mm;
int find(int x)
{
int r=x;
while(f[r]!=r)
r=f[r];
f[x]=r;
return r;
}
int main()
{
int x,y;
int flag=0;
while(scanf("%d%d",&x,&y)&&x!=-1&&y!=-1)
{
mm=0;
if(x==0&&y==0)
{
printf("Yes\n");
continue;
}
for(int i=0;i<100005;i++)
{
f[i]=i;
v[i]=0;
}
flag=0;
if(mm<x)
mm=x;
if(mm<y)
mm=y;
v[x]=1;
v[y]=1;
int fx=find(x);
int fy=find(y);
if(fx==fy)
flag=1;
else
f[fx]=fy;
while(scanf("%d%d",&x,&y)&&x!=0&&y!=0)
{
if(flag==1)
continue;
if(mm<x)
mm=x;
if(mm<y)
mm=y;
v[x]=1;
v[y]=1;
int fx=find(x);
int fy=find(y);
if(fx!=fy)
f[fx]=f[y];
else
flag=1;
}
if(flag==1)
printf("No\n");
else
{
int s=0;
for(int i=1;i<=mm;i++)
if(v[i])
if(f[i]==i)
s++;
if(s==1)
printf("Yes\n");
else
printf("No\n");
}
}
return 0;
}