/*
http://acm.hdu.edu.cn/showproblem.php?pid=1272
由于房间号不是连续的 ,所以 初始化maze为-1 来表示 没有该房间
*/
#include <stdio.h>
int maze[100010];
int find(int x)
{
int p = maze[x];
if(p==-1)
p=maze[x]=x;
while(p!=x)
{
x = p;
p = maze[x];
}
return p;
}
int len(int x)
{
int cnt=0;
int p = maze[x];
while(p!=x)
{
x = p;
p = maze[x];
cnt++;
}
return cnt;
}
int merge(int x, int y)
{
int px = find(x);
int py = find(y);
if(px==py)
return 1;
if(len(x) > len(y))
{
maze[py]=px;
}
else
{
maze[px]=py;
}
return 0;
}
int main()
{
freopen("input.txt","r",stdin);
int x,y;
while(scanf("%d %d",&x,&y)&&(x+y)!=-2)
{
int i;
for(i=0; i<100010; i++)
maze[i]=-1;
if(x==0&&y==0)//直接输入 0 0 的情况 ,特别要注意 !!!!
{
printf("Yes\n");
continue;
}
merge(x,y);
int flag=0;
while(scanf("%d %d",&x,&y)&&(x+y))
{
int f = merge(x,y);
if(f)
flag=1;
}
int sum=0;
for(i=1; i<100010; i++)//将非根的节点置为-1
{
if(maze[i]==-1) continue;
int p = maze[i];
int j = i;
while(p!=j)
{
maze[j]=-1;
j = p;
p = maze[j];
}
}
for(i=1; i<100010; i++)//如果多于一个非-1节点 就说明 有两个集合 他们之间没有通路
{
if(maze[i]!=-1)
sum++;
}
if(sum>1) flag=1;
if(flag)
printf("No\n");
else
printf("Yes\n");
}
return 0;
}
HDU 1272 小希的迷宫
最新推荐文章于 2022-12-14 05:30:22 发布