HDU1272 小希的迷宫 并查集

来源:互联网 发布:简单报表软件 编辑:程序博客网 时间:2024/05/19 17:06

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

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

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

#include <cstdio>#include <iostream>#include <cstring>using namespace std;#define MAX 100010int 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;}


 

1 0
原创粉丝点击