标签:
6 8 5 3 5 2 6 4 5 6 0 0 8 1 7 3 6 2 8 9 7 5 7 4 7 8 7 6 0 0 3 8 6 8 6 4 5 3 5 6 5 2 0 0 -1 -1
Yes Yes No
#include <stdio.h>
#include <stdlib.h>
int pre[100005];
int c[100005];
int a,b,panduan,nx;
int find(int x) //查找根节点
{
int r=x;
while ( pre[r ] != r ) //返回根节点 r
r=pre[r ];
int i=x , j ;
while( i != r ) //路径压缩
{
j = pre[ i ]; // 在改变上级之前用临时变量 j 记录下他的值
pre[ i ]= r ; //把上级改为根节点
i=j;
}
return r ;
}
void join(int x,int y) //判断x y是否连通,
//如果已经连通,就不用管了 //如果不连通,就把它们所在的连通分支合并起,
{
int fx=find(x),fy=find(y);
//printf("!%d %d\n",fx,fy);
if(fx!=fy)
{
pre[fx]=fy;
nx--;
}
else
panduan=1;
}
int sets()
{
int i;
for(i=0;i<=100000;i++)
{
pre[i]=i;
c[i]=1;
}
}
int main()
{
int i,t;
while(1)
{
sets();
nx=0;
panduan=0;
scanf("%d %d",&a,&b);
if(a==-1&&b==-1)
break;
else if(a==0&&b==0)
{
printf("Yes\n");
}
else
{
if(a!=b)
{
nx+=c[a]+c[b];
c[a]=0;
c[b]=0;
join(a,b);
}
while(1)
{
scanf("%d %d",&a,&b);
if(a==0&&b==0)
break;
else if(a!=b)
{
nx+=c[a]+c[b];
c[a]=0;
c[b]=0;
join(a,b);
}
}
if(panduan==0&&nx==1)
printf("Yes\n");
else
printf("No\n");
}
}
return 0;
}
标签:
原文地址:http://www.cnblogs.com/Qiao994255978/p/4679422.html