poj 1308 Is It A Tree? 并查集

题意:给你一些边,判断这些边能否构成一棵树。

分析:并查集,但是得注意:

  1.可能存在自环     2.每个数据开始输入为0 0 的时候也算一棵树

View Code
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
#define re(i,n) for(int i=0;i<n;i++)
#define re1(i,n) for(int i=1;i<=n;i++)
const int maxn = 110;
int p[maxn];
int flag[maxn];
inline void init() { re(i,maxn) p[i] = i; }
int find(int x) { return x == p[x] ? x : p[x] = find(p[x]); }
void Union(int x , int  y) {
    int a  =find(x) , b = find(y);
    p[a] = p[b] = p[x] = p[y] = min(a ,  b);
}
int main() {
    int x , y , cas = 1 ,tmp;
    while(~scanf("%d%d",&x,&y) && x!=-1) {
        if( !x && !y ) { printf("Case %d is a tree.\n",cas ++);continue; }
        memset(flag,0,sizeof(flag));
        init();
        tmp = x;
        int  ok = 1;
        flag[x] = flag[y] = true;
        if(x == y) ok = 0;
        else Union(x , y);
        while(scanf("%d%d",&x,&y) && x) {
            if(!ok) continue;
            flag[x] = flag[y] = true;
            if(find(x) != find(y)) Union(x , y);
            else ok = 0;
        }
        if(ok) {
            re1(i,maxn-1) if(flag[i] && find(tmp) != find(i)) { ok = 0 ;break; }
        }
        printf(ok ? "Case %d is a tree.\n" : "Case %d is not a tree.\n" , cas ++);
    }
    return 0;
}
posted @ 2012-07-05 17:15  lenohoo  阅读(208)  评论(0编辑  收藏  举报