hdu1272(并查集)

题目就不复制过来了,这道题有个坑就是当一组输入数据只有0 0时应该输出Yes

#include <iostream>
#include <stdio.h>
#include <memory.h>
using namespace std;
int parent[100001];
bool vis[100001];
void Init()
{
    for(int i=0;i<=100000;i++)
    {
        parent[i]=i;
    }
}
int findP(int x)
{
    if(parent[x]==x)
        return x;
    else
    {
        return parent[x]=findP(parent[x]);
    }
}
void Union(int x,int y)
{
    int xp=findP(x),yp=findP(y);
    parent[yp]=xp;
}
bool isallLinked()//检查是否所有出现的点都已经联通
{
    int p,i;
    for(i=1;i<100001;i++)
    {
        if(vis[i])
        {
            p=findP(i);break;
        }
    }
     for(;i<100001;i++)
    {
        if(vis[i]&&p!=findP(i))
            return false;
    }
    return true;
}
int main()
{
    //freopen("in.in","r",stdin);
    int N,M;
    Init();
    memset(vis,0,sizeof(vis));
    while(scanf("%d%d",&N,&M)&&N!=-1)
    {
        bool yes=true;
        vis[N]=vis[M]=true;
        Union(N,M);
        while(!(N==0&&M==0)&&scanf("%d%d",&N,&M)&&!(N==0&&M==0))
        {
            vis[N]=vis[M]=true;
            if(findP(N)==findP(M))
            {
                yes=false;
            }
            Union(N,M);
        }
        if(yes&&isallLinked())
            cout<<"Yes"<<endl;
        else
            cout<<"No"<<endl;
        Init();
        memset(vis,0,sizeof(vis));
    }
    return 0;
}

  

posted on 2015-08-04 19:45  insaneman  阅读(130)  评论(0)    收藏  举报

导航