您的位置:首页 > 其它

hdu 1272 小希的迷宫

2014-12-19 21:15 447 查看
题目:

链接:点击打开链接

题意:

思路:

一个并查集,题目就是要让你推断是否是一个连通的无环图。1>推断成环的时候,仅仅要推断输入边的两个点。有一个共同的父节点,那么这两个点就成环。2>推断连通的时候,仅仅要推断根节点数为1就可以。注意:当输入的这组数据仅仅有
0 0 时,依旧是满足,即应输出 "Yes"。

代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#define MAXN 100010
using namespace std;

int a,b;
int flag;
int root[MAXN],sign[MAXN];

int find(int x)
{
int r = x;
while(r != root[r])
r = root[r];
return r;
}

void merge(int x,int y)
{
int fx = find(x);
int fy = find(y);
if(fx != fy)
root[fx] = fy;
else//有共同的父节点
flag = 0;
}

int main()
{
//freopen("input.txt","r",stdin);
int ok;
while(scanf("%d%d",&a,&b) != EOF && (a != -1 || b != -1))
{
memset(root,0,sizeof(root));
if(a == 0 && b == 0)
{
printf("Yes\n");
continue;
}
for(int i=1; i<MAXN; i++)
{
root[i] = i;
sign[i] = 0;
}
sign[a] = 1;
sign[b] = 1;//输入的边的两个点
flag = 1;
merge(a,b);
while(scanf("%d%d",&a,&b) && (a || b))
{
merge(a,b);
sign[a] = 1;
sign[b] = 1;
}
ok = 0;
for(int i=1; i<MAXN; i++)
{
if(sign[i] && root[i] == i)
++ok;//根结点数目
if(ok>1)
flag = 0;
}
if(flag)
printf("Yes\n");
else
printf("No\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: