首页 > 代码库 > hdu 1272 小希的迷宫

hdu 1272 小希的迷宫

题目:

    链接:点击打开链接

题意:

思路:

    一个并查集,题目就是要让你判断是否是一个连通的无环图。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;
}