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; }

浙公网安备 33010602011771号