Code
#include <stdio.h>
#include <string.h>
int root[100005],f[100005];// root 保存 i 的根节点,f 保存输入的结点中是否有 i
int find(int x)
{
int r,i,j;
r=x;
while( root[r]!=r )
r=root[r];
i=r;
while( root[i]!=i )
{
j=root[i];
root[i]=r;
i=j;
}
return r;
}
int merge(int x,int y)
{
int px,py;
px=find(x);
py=find(y);
if( px==py && x!=y )//判断是否有回路
return 0;
else
{
root[px]=py;
return 1;
}
}
int main()
{
freopen("acm.txt","r",stdin);
int x,y,flag,i,n,max;// max 保存输入中最大的节点,为输出扫描根节点缩小范围
while( scanf("%d%d",&x,&y)!=EOF )
{
if( x==-1 && y==-1 )
break;
for(i=1;i<=100000;i++)
root[i]=i;
memset(f,0,sizeof(f));
flag=1; n=0; f[x]=1; f[y]=1;
if( x>y )
max=x;
else
max=y;
if( flag )
flag=merge(x,y);
if( x!=0 || y!=0 )
{
while( scanf("%d%d",&x,&y)!=EOF )
{
if( x==0 && y==0 )
break;
f[x]=1; f[y]=1;
if( x>max )
max=x;
if( y>max )
max=y;
if( flag )
flag=merge(x,y);
}
}
for(i=0;i<=max;i++)
{
if( root[i]==i && f[i]==1 )
n++;//判断是否是森林
}
if( flag==1 && n==1)
printf("Yes\n");
else
printf("No\n");
}
return 0;
}
#include <stdio.h>
#include <string.h>
int root[100005],f[100005];// root 保存 i 的根节点,f 保存输入的结点中是否有 i
int find(int x)
{
int r,i,j;
r=x;
while( root[r]!=r )
r=root[r];
i=r;
while( root[i]!=i )
{
j=root[i];
root[i]=r;
i=j;
}
return r;
}
int merge(int x,int y)
{
int px,py;
px=find(x);
py=find(y);
if( px==py && x!=y )//判断是否有回路
return 0;
else
{
root[px]=py;
return 1;
}
}
int main()
{
freopen("acm.txt","r",stdin);
int x,y,flag,i,n,max;// max 保存输入中最大的节点,为输出扫描根节点缩小范围
while( scanf("%d%d",&x,&y)!=EOF )
{
if( x==-1 && y==-1 )
break;
for(i=1;i<=100000;i++)
root[i]=i;
memset(f,0,sizeof(f));
flag=1; n=0; f[x]=1; f[y]=1;
if( x>y )
max=x;
else
max=y;
if( flag )
flag=merge(x,y);
if( x!=0 || y!=0 )
{
while( scanf("%d%d",&x,&y)!=EOF )
{
if( x==0 && y==0 )
break;
f[x]=1; f[y]=1;
if( x>max )
max=x;
if( y>max )
max=y;
if( flag )
flag=merge(x,y);
}
}
for(i=0;i<=max;i++)
{
if( root[i]==i && f[i]==1 )
n++;//判断是否是森林
}
if( flag==1 && n==1)
printf("Yes\n");
else
printf("No\n");
}
return 0;
}