您的位置:首页 > 其它

HDU 1272 小希的迷宫

2014-01-04 15:03 337 查看
题目链接http://acm.hdu.edu.cn/showproblem.php?pid=1272

题目解析

并查集问题

注意点

1.题目中的要求给的比较宽泛,导致大家认为只是存在回环就是错误,然而错误不止这一种,如果存在两棵树或者多棵树的现象那么也是错误的(即从A到不了B);

2.自身与自身相连接也是错误的一种。

可能的测试数据

1 1 0 0
0 0
1 2 3 4 0 0
1 2 2 3 3 4 0 0
1 3 5 3 0 0
-1 -1

答案:

No
Yes
No
Yes
Yes

参考代码

#include <stdio.h>

int fa[100005];  //父亲数组
int visit[100005];  //表示是否被连接过
int load(){
int i;
for(i = 0; i<100005; i++)
fa[i] = i;
}

int find(int x){
if(x!=fa[x])
fa[x] = find(fa[x]);
return fa[x];
}

int main(){
int m, n;
int x, y, fx, fy;
int i, flag, flag1, count;

while(scanf("%d%d", &m, &n)){
flag = 0;
count = 0;
flag1 = 0;
if(m==-1&&n==-1)    break;
else if(m==0&&n==0);
else {
load();
memset(visit, 0, sizeof(visit));
fa[m] = n;
visit[m] = 1;
visit
= 1;
if(m==n) flag = 1;
while(scanf("%d%d", &x,&y),x&&y){
fx = find(x);
fy = find(y);
visit[x] = 1;
visit[y] = 1;
if(fx==fy) flag = 1;
else fa[fx] = fy;
}
}
for(i = 0; i<100005; i++){
if(visit[i]&&fa[i]==i)
flag1++;
if(visit[i])
count++;
}

if(count==0)    printf("Yes\n");  //0 0的测试数据
else if(!flag&&flag1==1)   printf("Yes\n"); //没有回环并且只有一棵树
else    printf("No\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息