HDU1272 小希的迷宫 并查集

题目大意:给出一个迷宫,如果他是连通的且没有平行路径,输出Yes,否则输出No。

并查集纪录每个点的连通状态,对于每输入的两个点,合并他们的同时,看他们是否有相同的父亲,若有,则不符合题意。

数据输入完之后,再判断一下根结点是否唯一便可知该迷宫是否连通了。

#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;
#define MAX 100010
int par[MAX],s[MAX];
bool flag;
void Init()
{
    for(int i=1;i<MAX;i++)
    {
        par[i]=i;
        s[i]=0;
    }
}
int Find(int x)
{
    while(par[x]!=x)
      x=par[x];
    return x;
}
void Union(int x,int y)
{
    x=Find(x);
    y=Find(y);
    if(x!=y) par[x]=y;
    else flag=false;
}
int main()
{
    int a,b;
    while(scanf("%d%d",&a,&b))
    {
        if(a==-1&&b==-1) break;
        if(a==0&&b==0)
        {
            puts("Yes");
            continue;
        }
        Init();
        s[a]=s[b]=1;
        flag=true;
        Union(a,b);
        while(scanf("%d%d",&a,&b))
        {
            if(a==0&&b==0) break;
            s[a]=s[b]=1;
            Union(a,b);
        }
        int k=0;
        for(int i=1;i<MAX;i++)
        {
            if(s[i]&&par[i]==i) k++;
            if(k>1)
            {
                flag=false;
                break;
            }
        }
        if(flag) puts("Yes");
        else puts("No");
    }
    return 0;
}


 

你可能感兴趣的:(HDU1272 小希的迷宫 并查集)