http://acm.hdu.edu.cn/showproblem.php?pid=1325
题意:
判断一个图是不是说树
只有树的根入度为 0 ,其余结点入度均为 1;



6 8 5 3 5 2 6 4 5 6 0 0 8 1 7 3 6 2 8 9 7 5 7 4 7 8 7 6 0 0 3 8 6 8 6 4 5 3 5 6 5 2 0 0 -1 -1
Case 1 is a tree. Case 2 is a tree. Case 3 is not a tree.
#include <iostream>  
#include <cstdio>  
#include <string>  
#include <cstring>  
#include <cstdlib>  
#include <algorithm>  
#include <vector>  
#include <set>  
#include <map>  
using namespace std;
#define N 100010
bool used[N*10];
int queue[N];
int in[N];
int fa[N];
int findd(int x)
{
	if (fa[x] == -1)
		return x;
	else
		return fa[x] = findd(fa[x]);
}
void un(int n,int m)
{
	int fx = findd(n);
	int fy = findd(m);
	if (fx != fy)
		fa[fy] = fx;
}
int main()
{
	int n, m, cases = 1;
	memset(used,false,sizeof(used));
	memset(in,0,sizeof(in));
	memset(fa,-1,sizeof(fa));
	bool ok = true; int num = 0;
	while (scanf("%d %d", &n, &m) != EOF)
	{
		if (n == -1 && m == -1)
			break;
		else if (n == 0 && m == 0)
		{
			int num1 = 0;
			for (int i = 0; i < num; i++)
			{
				if (findd(queue[i]) != findd(queue[0]))
				{
					ok = false;
					break;
				}
				if (in[queue[i]] == 0)
					num1++;
				if (in[queue[i]] > 1)
				{
					ok = false;
					break;
				}
			}
			if (num1 != 1)
				ok = false;
			if (num == 0)
				ok = true;
			if (ok)
				printf("Case %d is a tree.\n",cases++);
			else
				printf("Case %d is not a tree.\n", cases++);
			memset(used, false, sizeof(used));
			memset(in, 0, sizeof(in));
			memset(fa, -1, sizeof(fa));
			ok = true, num = 0;
		}
		else
		{
			if (!used[n])
			{
				used[n] = true;
				queue[num++] = n;
			}
			if (!used[m])
			{
				used[m] = true;
				queue[num++] = m;
			}
			if (findd(n) == findd(m))
				ok = false;
			else
			{
				in[m]++;
				un(n,m);
			}
		}
	}
	return 0;
}hdu-1325 & poj-1308 Is It A Tree?
原文地址:http://blog.csdn.net/u014427196/article/details/43086419