poj_1308 Is It A Tree

题目链接:http://poj.org/problem?id=1308

题意:给你一张图,让你判断是否是一棵树。

思路:树的判定:1、一棵树只有一个根节点,有多个根节点则为森林。2、树上没有环,没有多重边。

        3、点自身不存在环。4、0 0也是一棵树。用并查集来做。

/*
 * poj1308__IsItATree.cpp
 *  Created on: 2013年8月26日
 *  Author: pirate
 */
#include <set>
#include <map>
#include <list>
#include <deque>
#include <queue>
#include <cmath>
#include <bitset>
#include <vector>
#include <cstdio>
#include <string>
#include <cstring>
#include <fstream>
#include <cstdlib>
#include <iostream>
#include <algorithm>
using namespace std;
#define N 5000
#define I64 __int64
#define LL long long
#define PI acos(-1.0)
#define L(a) ((a)<<1)
#define R(a) ((a)<<1+1)
#define    sqr(a) ((a)*(a))
#define MID(a,b) ((a)+(b))/2
#define ABS(a) (a)>0?(a):(-a)
#define MAX(a,b) ((a)>(b)?(a):(b))
#define MIN(a,b) ((a)<(b)?(a):(b))
#define INIT(a,b) memset(a,b,sizeof(a))

int fa[N];
int flag[N];
void init() {
    for (int i = 0; i < N; i++) {
        fa[i] = i;
        flag[i] = 0;
    }
}
int Find(int x) {
    if (x == fa[x])
        return x;
    else
        return Find(fa[x]);
}
void Unit(int x, int y) {
    int xx = Find(x);
    int yy = Find(y);
    if (xx != yy) {
        fa[xx] = yy;
    }
}
int main() {
    int t = 1, n, m;
    while (cin >> n >> m) {
        if (n == -1 && m == -1)
            break;
        if (n == 0 && m == 0) {
            cout << "Case " << t << " is a tree." << endl;
            t++;
            continue;
        }//0 0 特别处理
        init();
        bool tree = true;
        int maxtree = 0;
        int son = n;
        if (n == m) {//判断是否单点上存在环
            tree = false;
        } else if (Find(n) == m || Find(m) == n || Find(n) == Find(m)) {//判断树上是否有环,有多重变
            tree = false;
        } else if (fa[n] == m || fa[m] == n) {
            tree = false;
        } else {
            Unit(n, m);
            flag[n] = 1;
            flag[m] = 1;
        }
        while (cin >> n >> m) {
            if (n == 0 && m == 0)
                break;
            if (n == m) {
                tree = false;
            } else if (Find(n) == m || Find(m) == n || Find(n) == Find(m)) {
                tree = false;
            } else if (fa[n] == m || fa[m] == n) {
                tree = false;
            } else {
                Unit(n, m);
                flag[n] = 1;
                flag[m] = 1;
            }
            maxtree = MAX(n,MAX(maxtree,m));
        }
        //判断是否只有一个根节点
        for (int i = 0; i < maxtree; i++) {
            if (flag[i] == 1 && Find(i) != Find(son)) {
                tree = false;
            }
        }
        if (tree) {
            cout << "Case " << t << " is a tree." << endl;
        } else {
            cout << "Case " << t << " is not a tree." << endl;
        }
        t++;
    }
    return 0;
}
View Code

 

posted @ 2013-08-26 20:22  oucacm  阅读(166)  评论(0)    收藏  举报