#include <stdio.h>
#include <string.h>
int stack[100010];
int queue[100010];
int find(int x)
{
int r,j,k;
r=x;
while(r!=stack[r])
r=stack[r];
k=x;
while(k!=r)
{
j=stack[k];
stack[k]=r;
k=j;
}
return r;
}
void merge(int x,int y)
{
int fx=find(x);
int fy=find(y);
if(fx!=fy)
stack[fx]=fy;
}
int main()
{
int n,m,c,i;
while(scanf("%d %d",&n,&m)!=EOF)
{
c=0; //用来记录输入的点的个数
if(n==-1&&m==-1) //先判断第一对数据,如果都是-1则结束
break;
if(n==0&&m==0) //若第一对数据都是0,则输出Yes,这个也挺坑的,题目中根本就没提示,但事实在这摆着呢,后台数据就是怎么过的!!!
{
printf("Yes\n");
continue;
}
memset(stack,0,sizeof(stack)); //由于不知道是哪个数,所以先对这个数组清零
stack[n]=n;
stack[m]=m;
if(n!=m)
{
queue[c++]=n; //把输进去的数放到一个数组里,用来记录所出现过的数
queue[c++]=m;
}
else
queue[c++]=n;
merge(n,m);
int count =1;
while(scanf("%d %d",&n,&m)&&n!=0&&m!=0) //接着输入剩下的数
{
count++; //记录两个房间相连的通道条数
if(stack[n]==0)
{
stack[n]=n;
queue[c++]=n;
}
if(stack[m]==0)
{
stack[m]=m;
queue[c++]=m;
}
merge(n,m);
}
int k=0;
for(i=0; i<c; i++)
{
if(stack[queue[i]]==queue[i]) //判断根节点是不是只有一个,即这几个房间是不是都连在了一起
k++;
}
if(c==count+1&&k==1) //若没有迂回通道,那么点的个数就等于通道条数加一
printf("Yes\n");
else
printf("No\n");
}
}
小希的迷宫
最新推荐文章于 2021-05-18 09:50:10 发布