HDU 1272 小希的迷宫

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

并查集,一开始没看出来.想到后原以为用并查集挺简单的.

没想到各种坑啊.

1.单个测试数据0 0,也就是空图,输出Yes.(什么设定啊?没房间了都.)

2.图中可能有不只一个的集合.(赤裸裸的陷阱啊,我就这样卡了好久啊妈蛋)

最后贴代码吧..又写得好丑

#include <iostream>
using namespace std;
int p[101000],used[101000];
int find(int x)
{
    while(x != p[x])
        x = p[x];
    return x;
}
int flag,edge,vertex;
void init()
{
    flag = 1;
    for(int i=0;i<101000;i++)
    {
        p[i] = i;
    }
    memset(used,0,sizeof(used));

}
void merge(int s,int e)
{
    if(!flag) return;
    int x = find(s);
    int y = find(e);
    if(x!=y)
        p[x] = y;
    else flag = 0;
}

int main()
{
    int s,e;
//    freopen("input.txt","r",stdin);
    while(cin>>s>>e&&(s+e)!=-2)
    {
        init();
        p[s] = e;
        used[s] = 1;    //标记结点已用,下同
        used[e] = 1;
        edge = 1;        //初始时为一边
        vertex = 2;        //初始时为二点
        if(s == 0 && e == 0) 
        {
            cout<<"Yes"<<endl;
            continue;
        }
        if(s == e ) flag = 0;//自环

        while(cin>>s>>e&&(s+e))
        {
            if(s == e) flag = 0;//自环
            merge(s,e);    //合并两点.边加1
            edge++;
            if(!used[s]) vertex++; //若该点未用,则为新点,结点加1,下同
            if(!used[e]) vertex++;
            used[s] = 1;
            used[e] = 1;
            
        }
        if(flag && vertex == edge+1 ) cout<<"Yes"<<endl;//若最终结点数与边数相差1,则为符合条件的无回路的连通图.图中可能有双集合.故须做此验证
        else cout<<"No"<<endl;
    }
    return 0;
}

 

posted @ 2013-10-05 04:32  Destino74  阅读(248)  评论(0编辑  收藏  举报