poj1308【并查集】

= =、如果输入的两个数相等。就不是一颗树啊,不能自己指向自己。
水。(瞎开的数组)。

//#include <bits/stdc++.h>
#include<iostream>
#include<cstdio>
#include<math.h>
#include<string.h>
#include<algorithm>
using namespace std;
typedef long long LL;
typedef unsigned long long ULL;
const double eps=1e-6;
const double pi=acos(-1.0);
const int mod=998244353;
const int INF=0x3f3f3f3f;

const int N=1e5+8;

bool vis[N];
int pre[N];

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

int main()
{
    int aa,bb;
    int a,b,flag,flat;
    int t;
    int tmax,tmin;
    t=1;
    while(1){
        scanf("%d%d",&a,&b);
        if(a==-1&&b==-1){
            break;
        }
        if(!a&&!b){
            printf("Case %d is a tree.\n",t++);
            continue;
        }
        for(int i=1;i<=5000;i++)
            pre[i]=i;
        memset(vis,0,sizeof(vis));
        flag=flat=0;
        tmin=INF;tmax=-1;
        if(a==b){
            flag=1;
        }
        else{            
            vis[a]=vis[b]=1;
            aa=Find(a);
            bb=Find(b);
            tmin=min(tmin,min(a,b));
            tmax=max(tmax,max(a,b));
            if(aa!=bb){
                pre[aa]=bb;
            }
        }
        while(scanf("%d%d",&a,&b))
        {
            if(!a&&!b) break;
            if(flag)
                continue;
            if(a==b) flag=1;
            else{

                tmin=min(tmin,min(a,b));
                tmax=max(tmax,max(a,b));
                aa=Find(a);
                bb=Find(b);
                vis[a]=vis[b]=1;
                if(aa!=bb){
                    pre[aa]=bb;
                }
                else{
                    flag=1;
                }
            }
        }
        if(!flag){
            int xx=Find(tmin);
            for(int i=tmin;i<=tmax;i++){
                if(vis[i]&&xx!=Find(i)){
                    flat=1;
                    break;
                }
            }
            if(flat){
                printf("Case %d is not a tree.\n",t++);
            }
            else
                printf("Case %d is a tree.\n",t++);
        }
        else{
            printf("Case %d is not a tree.\n",t++);
        }
    }
}


posted @ 2016-07-19 09:39  see_you_later  阅读(137)  评论(0编辑  收藏  举报