NOI 3.8 图 310: Is It A Tree?(树的定义)

题目来源:http://noi.openjudge.cn/ch0308/310/

310: Is It A Tree?

总时间限制1000ms    内存限制65536kB

描述

A tree is a well-known data structure that is either empty(null, void, nothing) or is a set of one or more nodes connected by directededges between nodes satisfying the following properties. 

There is exactly one node, called the root, to which no directed edges point. 
Every node except the root has exactly one edge pointing to it. 
There is a unique sequence of directed edges from the root to each node. 
For example, consider the illustrations below, in which nodes are representedby circles and edges are represented by lines with arrowheads. The first two ofthese are trees, but the last is not. 


In this problem you will be given several descriptions of collections of nodesconnected by directed edges. For each of these you are to determine if thecollection satisfies the definition of a tree or not.

输入

The input will consist of a sequence of descriptions (testcases) followed by a pair of negative integers. Each test case will consist ofa sequence of edge descriptions followed by a pair of zeroes Each edgedescription will consist of a pair of integers; the first integer identifiesthe node from which the edge begins, and the second integer identifies the nodeto which the edge is directed. Node numbers will always be greater than zero.

输出

For each test case display the line "Case k is atree." or the line "Case k is not a tree.", where k correspondsto the test case number (they are sequentially numbered starting with 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.

来源

North Central North America 1997

-----------------------------------------------------

思路

利用树的两条性质判断:

1. 树的节点数比边数多1(空树除外)

2. 树中除根节点的每个节点只有唯一的父节点

条件1可以排除有环的图,条件2可以排除多个根的图。

特别注意的是,空树不满足条件1,需单独判断!

-----------------------------------------------------

代码 

#include<iostream>
#include<fstream>
#include<cstring>
#include<set>
using namespace std;

const int NMAX = 100005;
bool a[NMAX] = {};

int main()
{
#ifndef ONLINE_JUDGE
	ifstream fin ("0308_310.txt");
	int n,m,cnt = 1,edge = 0;
	bool is_tree = true;
	set<int> s;
	while (fin >> n >> m)
	{
		if (n<0)
		{
			break;
		}
		if (n==0 && m==0)
		{
			if (is_tree && (edge == s.size()-1||(s.size()==0 && edge==0)))		// 0 0空树也是数, 需要特殊处理
			{
				cout << "Case " << cnt << " is a tree." << endl;
			}
			else
			{
				cout << "Case " << cnt << " is not a tree." << endl;
			}
			cnt++;
			is_tree = true;
			memset(a,0,sizeof(a));
			s.clear();
			edge = 0;
			continue;
		}
		if (a[m])
		{
			is_tree = false;
		}
		else
		{
			a[m] = true;
			s.insert(n);
			s.insert(m);
			edge++;
		}
	}
	fin.close();
#endif
#ifdef ONLINE_JUDGE
	int n,m,cnt = 1,edge = 0;
	bool is_tree = true;
	set<int> s;
	while (cin >> n >> m)
	{
		if (n<0)
		{
			break;
		}
		if (n==0 && m==0)
		{
			if (is_tree && (edge == s.size()-1||(s.size()==0 && edge==0)))		// 0 0空树也是数, 需要特殊处理
			{
				cout << "Case " << cnt << " is a tree." << endl;
			}
			else
			{
				cout << "Case " << cnt << " is not a tree." << endl;
			}
			cnt++;
			is_tree = true;
			memset(a,0,sizeof(a));
			s.clear();
			edge = 0;
			continue;
		}
		if (a[m])
		{
			is_tree = false;
		}
		else
		{
			a[m] = true;
			s.insert(n);
			s.insert(m);
			edge++;
		}
	}
#endif
}


猜你喜欢

转载自blog.csdn.net/da_kao_la/article/details/80721158
3.8