hdu 1272 小希的迷宫

来源:互联网 发布:淘宝店铺标志尺寸 编辑:程序博客网 时间:2024/06/18 11:18

hdu 1272 小希的迷宫
要点: 任意两个房间有且仅有一条路径可以相通。
1.不能形成环。
2.只能有一棵树,不能有多颗树。

//1272 并查集 已过 #include<iostream>#include<string.h>using namespace std;#define Maxn 100005 int pre[100005];int used[Maxn];int m,flag;int find(int x){    while(pre[x]!=x)    {        x=pre[x];    }    //int i=x,j;    //while(i!=r)    //{    //  j=pre[i];    //  pre[i]=r;    //  i=j;    //}    return x; }  int join(int x,int y)   {    int fx=find(x),fy=find(y);    if(fx==fy)    return 0;    else    pre[fx]=fy;    return 1;}int main(){    int t;//t表示当前点数和边数的差值; flag表示有几个根 有一个根代表是联通的     int m,n;    while(scanf("%d %d",&m,&n)==2)    {        if(m==-1&&n==-1) return 0;    if(m==0&&n==0)    {        cout<<"Yes"<<endl;        continue;    }     for(int i=1;i<Maxn;i++)    pre[i]=i;//必须每次都有     memset(used,0,100005*sizeof(int));    //cout<<m<<n<<endl;    join(m,n);    used[m]=1;    used[n]=1;//  cout<<used[m]<<m<<" "<<used[n]<<" "<<endl;    t=1;    flag=1;//  cout<<flag<<endl;     while(scanf("%d %d",&m,&n)!=EOF)     {        if(m==0&&n==0) break;        if(used[m]==0)         {            t++;            used[m]=1;            //cout<<m<<" "<<t<<"$"<<endl;         }         if(used[n]==0){            t++;            used[n]=1;            //cout<<t<<"*";         }         if(join(m,n)==0)           {           flag=0;           //cout<<m<<" "<<n<<" "<<flag<<endl;           }        else           t--;           //cout<<m<<"  "<<n<<"  "<<t<<"#"<<endl;    }    //cout<<flag<<" "<<t<<endl;    if(flag&&t==1)    cout<<"Yes"<<endl;    else    cout<<"No"<<endl;     }    return 0; } 

新手,请多多指教