题目链接: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[n] = 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;
}