小希的迷宫 HDU - 1272

#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int N=1e5;
int a,b;
int p[N+10];
// 标记走过的房间 
bool vis[N+10];
int find(int x)
{
    if(p[x]!=x)
        p[x]=find(p[x]);
    return p[x];
}
void Union(int a,int b)
{
    int pa=find(a);
    int pb=find(b);
    if(pa!=pb)
        p[pb]=pa;
}
int main()
{
    while(cin>>a>>b)
    {
        if(a==-1&&b==-1)
            break;
        // a,b 均为 0 时,也要输出 Yes;空树也是树
        if(a==0&&b==0)
        {
            cout<<"Yes"<<endl;
            continue;
        }
        for(int i=1;i<=N;i++)
            p[i]=i,vis[i]=0;
        int maxx=0;
        bool flag=0;
        while(a||b)
        {
            vis[a]=1;
            vis[b]=1;
            //是否成环 
            if(find(a)==find(b))
                flag=1;
            Union(a,b);
            // 找出房间编号的最大值     
            maxx=max(maxx,max(a,b));
            cin>>a>>b;
        }
        if(flag)
            cout<<"No"<<endl;
        else
        {
            int cnt=0;
            // 计算共有几个符合条件的联通集合 
            for(int i=1;i<=maxx;i++)
                if(vis[i]&&p[i]==i)
                    cnt++;
            // 这里可能存在不止一个集合,这样的话 ans 值就大于 1 了,这样就不满足题意了,就该输出 No 
            if(cnt==1)
                cout<<"Yes"<<endl;
            else
                cout<<"No"<<endl;
        }
    }
    return 0;
}

 

posted @ 2020-02-02 11:44  晴屿  阅读(111)  评论(0编辑  收藏  举报