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

该博客介绍了如何确定一个由节点和有向边组成的集合是否符合树的数据结构定义。通过检查每个节点的入度以及边的数量,可以判断是否满足树的两个关键性质:节点数比边数多1(空树除外)和每个非根节点有且仅有一个父节点。博主提供了一个样例输入和输出,并提出了判断方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目来源: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
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值