[hdu1272] 小希的迷宫

来源:互联网 发布:淘宝卖家差评申诉 编辑:程序博客网 时间:2024/05/21 17:07

题目链接

题解:判断联通无环图

#include <iostream>#include <cstdio>using namespace std;const int MX=100005;int n,m,p,q;int flag,tot;int f[MX+5],rk[MX+5],vis[MX+5];inline int find(int x){    if(f[x]==x) return x;    int t=find(f[x]);    f[x]=t;    return f[x];}inline void ready(){    for(int i=1;i<=MX;i++)     f[i]=i,vis[i]=0,rk[i]=0;     flag=0;tot=0;}inline void uniom(int p,int q){    int x=find(p),y=find(q);    if(x==y) {        flag=1;//x==y说明他们是同一个祖先,一旦连通便与祖先3者成环         return ;    }    //edge++;     if(rk[x]>rk[y])      f[y]=x;    else      {        f[x]=y;       if(rk[x]==rk[y])        rk[y]++;    } }int main(){    while(scanf("%d%d",&p,&q)!=EOF&&p!=-1&&q!=-1){        ready();        if(!p&&!q){            printf("Yes\n"); //为空树               continue;        }        do        {            vis[p]=1;            vis[q]=1;            uniom(p,q);         }while(scanf("%d%d",&p,&q)!=EOF&&p&&q);        if(!flag)        {            for(int i=1;i<=MX;i++)            {                if(vis[i]&&f[i]==i)//if(vis[i])                tot++;             //n++;                if(tot>1)                {                    flag=1;                    break;                }            }        }        if(flag)       //if(flag&&edge==n-1)        printf("No\n");        else        printf("Yes\n");    }    return 0;}
0 0