HDU

来源:互联网 发布:js中div显示隐藏 编辑:程序博客网 时间:2024/06/03 19:08

题目:http://acm.hdu.edu.cn/showproblem.php?pid=1272

分析:要符合小希的想法则必须满足两个条件,一是图是连通的,二是不存在环。这样才能是两点之间存在唯一一条通路,说白了就是一无向连通无环图。用并查集判断是否有环,同时统计图的边和点的个数,必须满足num(vertex)+1=num(edge)。注意考虑图为空的情况。(坑啊)

代码:

#include<iostream>#include<cstring>using namespace std;const int maxn = 1e5+10;int flag[maxn],pre[maxn];void init(){    for(int i=1;i<=maxn;pre[i]=i,i++);}int Find(int x){    while(x!=pre[x])        x=pre[x];    return x;}void input(){    int room1,room2;    while(cin>>room1>>room2){        if(room1==-1&&room2==-1) break;        if(room1==0&&room2==0){///空树!!!特殊情况没考虑到wa了好几次            cout<<"Yes"<<endl;            continue;        }        init();        memset(flag,0,sizeof(flag));        int edge=1,point=0,circle=0;        flag[room1]++;        flag[room2]++;        if(Find(room1)==Find(room2)) circle=1;        else pre[Find(room1)]=Find(room2);        while(cin>>room1>>room2&&(room1||room2)){            edge++;            flag[room1]++;            flag[room2]++;            if(Find(room1)==Find(room2)) circle=1;            else pre[Find(room1)]=Find(room2);        }        for(int i=1;i<maxn;i++)            if(flag[i]) point++;        if(!circle&&point==edge+1) cout<<"Yes"<<endl;        else cout<<"No"<<endl;    }}int main(){    input();}