hdoj1272【并查集】

因为是第二遍,所以题目也没怎么看,然后一开始的思路就是如果每次输入两个点的时候判断是不是同一个集合,如果同一个就是No,然后就wa了,想想也是,然后瞄了一下题解,还要判连通…真是蠢死了…多个集合都想不到,然后搞好以后还是wa…这次是在想不通了…然后偷瞄了代码…草泥马只有“0,0”的时候是Yes,哎,就是漏洞百出的思路,这还是得多练啊。。。

#include<cstdio>
#include<queue>
#include<iostream>
#include<string.h>
#include<algorithm>
using namespace std;
typedef long long LL;
#define INF 0x3f3f3f3f
#define mod 1000000007
#define N 100010

int pre[N];
int n;
int flag;
int vis[N];

void init()
{
    flag=0;
    for(int i=1;i<=N;i++)
    {
        pre[i]=i;
        vis[i]=0;
    }   
}

int Find(int x)
{
    int r;
    r=x;
    while(pre[r]!=r)
    {
        r=pre[r];
    }
    int i=x,j;
    while(pre[i]!=r)
    {
        j=pre[i];
        pre[i]=r;
        i=j;
    }
    return r;
}

void solve(int a,int b)
{
    a=Find(a);
    b=Find(b);
    if(a==b)
    {
        flag=1;
        return;
    }
    pre[a]=b;
}

int main()
{
    int m;
    int T;
    int a,b;
    int Tmax,Tmin;
    while(1)
    {   

        Tmax=-1;
        Tmin=N;

        init();
        scanf("%d%d",&a,&b);
        if(a==-1&&b==-1)
            break;
        if(a==0&&b==0)
        {
            printf("Yes\n");
            continue;
        }
        Tmax=max(Tmax,max(a,b));
        Tmin=min(Tmin,min(a,b));
        vis[a]=vis[b]=1;
        if(a==b)
            flag=1;
        pre[a]=b;

        while(scanf("%d%d",&a,&b))
        {
            if(!a&&!b)
                break;
            Tmax=max(Tmax,max(a,b));
            Tmin=min(Tmin,min(a,b));
            vis[a]=vis[b]=1;
            solve(a,b);
        }

        if(!flag)
        {
            for(int i=Tmin;i<=Tmax;i++)
            {
                if(pre[i]==i&&vis[i])
                    flag++;
            }
            if(flag==1)
                puts("Yes");
            else
                puts("No");
        }
        else
            puts("No");
    }
    return 0;
} 
posted @ 2016-05-23 19:40  see_you_later  阅读(102)  评论(0编辑  收藏  举报