题目来源:Aizu - ALDS1_7_A

题目:

A graph G = (VE) is a data structure where V is a finite set of vertices and E is a binary relation on V represented by a set of edges. Fig. 1 illustrates an example of a graph (or graphs).

 
Fig. 1

A free tree is a connnected, acyclic, undirected graph. A rooted tree is a free tree in which one of the vertices is distinguished from the others. A vertex of a rooted tree is called "node."

Your task is to write a program which reports the following information for each node u of a given rooted tree T:

  • node ID of u
  • parent of u
  • depth of u
  • node type (root, internal node or leaf)
  • a list of chidlren of u

If the last edge on the path from the root r of a tree T to a node x is (px), then p is the parent of x, and x is a child of p. The root is the only node in T with no parent.

A node with no children is an external node or leaf. A nonleaf node is an internal node

The number of children of a node x in a rooted tree T is called the degree of x.

The length of the path from the root r to a node x is the depth of x in T.

Here, the given tree consists of n nodes and evey node has a unique ID from 0 to n-1.

Fig. 2 shows an example of rooted trees where ID of each node is indicated by a number in a circle (node). The example corresponds to the first sample input.

 
Fig. 2

Input

The first line of the input includes an integer n, the number of nodes of the tree.

In the next n lines, the information of each node u is given in the following format:

id k c1 c2 ... ck

where id is the node ID of uk is the degree of uc1 ... ck are node IDs of 1st, ... kth child of u. If the node does not have a child, the k is 0.

Output

Print the information of each node in the following format ordered by IDs:

node id: parent = p , depth = dtype, [c1...ck]

p is ID of its parent. If the node does not have a parent, print -1.

d is depth of the node.

type is a type of nodes represented by a string (root, internal node or leaf). If the root can be considered as a leaf or an internal node, print root.

c1...ck is the list of children as a ordered tree.

Please follow the format presented in a sample output below.

Constraints

  • 1 ≤ n ≤ 100000

Sample Input 1

13
0 3 1 4 10
1 2 2 3
2 0
3 0
4 3 5 6 7
5 0
6 0
7 2 8 9
8 0
9 0
10 2 11 12
11 0
12 0

Sample Output 1

node 0: parent = -1, depth = 0, root, [1, 4, 10]
node 1: parent = 0, depth = 1, internal node, [2, 3]
node 2: parent = 1, depth = 2, leaf, []
node 3: parent = 1, depth = 2, leaf, []
node 4: parent = 0, depth = 1, internal node, [5, 6, 7]
node 5: parent = 4, depth = 2, leaf, []
node 6: parent = 4, depth = 2, leaf, []
node 7: parent = 4, depth = 2, internal node, [8, 9]
node 8: parent = 7, depth = 3, leaf, []
node 9: parent = 7, depth = 3, leaf, []
node 10: parent = 0, depth = 1, internal node, [11, 12]
node 11: parent = 10, depth = 2, leaf, []
node 12: parent = 10, depth = 2, leaf, []

Sample Input 2

4
1 3 3 2 0
0 0
3 0
2 0

Sample Output 2

node 0: parent = 1, depth = 1, leaf, []
node 1: parent = -1, depth = 0, root, [3, 2, 0]
node 2: parent = 1, depth = 1, leaf, []
node 3: parent = 1, depth = 1, leaf, []

Note

You can use a left-child, right-sibling representation to implement a tree which has the following data:

  • the parent of u
  • the leftmost child of u
  • the immediate right sibling of u

Reference

Introduction to Algorithms, Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, and Clifford Stein. The MIT Press.

思路:

这题是挑战程序设计2里的,代码按照书上写了一遍。然后仔细梳理了一下还是挺容易的。

首先建立一个结构体,里面包含p,l,r。其中p是parent,表示某节点的父结点,也就是它上面的那个。l是left,表示每个结点下最左边的那个子结点,r是right,表示每个结点右边的同行结点。

先来看输入。输入时,当第一个数字是接下来的数字的父结点,第二个数字是它有几个子结点,后面的数字就都是第一个数字的子结点了,所以从第三个数字开始,把第三个数字记作第一个数字的l,后面的记作每一个的前一个的r,并且从第三个数字开始,都要把第一个数字记作他们的p。

然后找他们的层次还是很简单的,就递归然后记一下。

最后输出。

代码:

#include<iostream>
#include<cstring>
using namespace std;
#define MAX 100005
#define NIL -1struct Node{int p,l,r;}T[MAX];
int n,D[MAX];void print(int u)
{int i,c;cout<<"node "<<u<<": ";cout<<"parent = "<<T[u].p<<", ";cout<<"depth = "<<D[u]<<", ";if(T[u].p==NIL)cout<<"root, ";else if(T[u].l==NIL)cout<<"leaf, ";else cout<<"internal node, ";cout<<"[";for(i=0,c=T[u].l;c!=NIL;i++,c=T[c].r){if(i==0)cout<<c;else cout<<", "<<c;}cout<<"]"<<endl;
}int rec(int u,int p)
{D[u]=p;if(T[u].r!=NIL)rec(T[u].r,p);if(T[u].l!=NIL)rec(T[u].l,p+1);
}int main()
{int i,j,d,v,c,l,r;while(cin>>n){for(i=0;i<n;i++)T[i].p=T[i].l=T[i].r=NIL;for(i=0;i<n;i++){cin>>v>>d;for(j=0;j<d;j++){cin>>c;if(j==0)T[v].l=c;else T[l].r=c;l=c;T[c].p=v;}}for(i=0;i<n;i++){if(T[i].p==NIL)r=i;}rec(r,0);for(i=0;i<n;i++){print(i);}}return 0;
}

【有根树】Rooted Trees C++相关推荐

  1. HDU 1294 Rooted Trees Problem

    题目大意:求有n个节点的树有几种? 题解:http://www.cnblogs.com/keam37/p/3639294.html #include <iostream> typedef ...

  2. leetcode310. Minimum Height Trees

    题目 For an undirected graph with tree characteristics, we can choose any node as the root. The result ...

  3. 树的最小高度 Minimum Height Trees

    2019独角兽企业重金招聘Python工程师标准>>> 问题: For a undirected graph with tree characteristics, we can ch ...

  4. 【ACM】树 小结

    树是一种表达层级结构的数据结构,也是实现高效算法与数据结构的基础. 学习之前的基础:数组,循环处理,结构体,递归函数. 树:由结点(node)和连接结点的边(edge)构成.             ...

  5. Codeforces 103B. Cthulhu 并查集运用

    题目链接: 题面: ...Once upon a time a man came to the sea. The sea was stormy and dark. The man started to ...

  6. [leetcode] 题型整理之图论

    图论的常见题目有两类,一类是求两点间最短距离,另一类是拓扑排序,两种写起来都很烦. 求最短路径: 127. Word Ladder Given two words (beginWord and end ...

  7. 杭电OJ分类题目(1)

    原题出处:HDOJ Problem Index by Type,http://acm.hdu.edu.cn/typeclass.php 杭电OJ分类题目(1) HDU Introduction HDU ...

  8. Graph Visualization and Navigation in Information Visualization: A Survey 译文

    图像可视化和信息可视化导航:文献综述 Ivan Herman, Member, IEEE Computer Society, Guy MelancËon, and M. Scott Marshall ...

  9. js+html 实现关系拓扑图

    最近要做一个功能.需要用到关系拓扑图.做了一些调研.发现相关插件很多接下来做个分析 1.yWorks 德国人做的.支持jAjax,html ,php. 官网 https://www.yworks.co ...

最新文章

  1. 深度学习经典数据集汇总
  2. 包红b2c模块 flutter与原生交互
  3. 【Android 性能优化】布局渲染优化 ( 过渡绘制 | 背景设置产生的过度绘制 | Android 系统的渲染优化 | 自定义布局渲染优化 )
  4. C++ Primer 5th笔记(chap 14 重载运算和类型转换)函数调用运算符
  5. Angular中怎样通过localStorage实现数据持久化-实现存储搜索历史为例
  6. 大型Web2.0站点构建技术初探一
  7. byteman_使用Byteman和JUnit进行故障注入
  8. 快速排序和快速选择(quickSort and quickSelect)算法
  9. 二叉搜索树相关知识及应用操作
  10. linux 基础训练,Linux 基础训练习题
  11. 第八节:ES6为数组做了哪些扩展?
  12. 视觉SLAM十四讲学习笔记专栏汇总
  13. annotationprocessor 提示找不到类_StackOverflow上87万访问量的问题:什么是“找不到符号”?...
  14. png文件合并_程序员学习之在Python中使用PDF:阅读、旋转、合并和拆分
  15. linux下的man和info命令
  16. 终于得空,写两句了......
  17. my eclipse 连接数据库(详细步骤)
  18. android短信验证码方案,Android之短信验证码
  19. 招生啦!清华大学SIGS人工智能硕士项目2021年硕士研究生普通招考说明
  20. QQ邮箱获取和使用授权码

热门文章

  1. 百度云盘 油猴下载助手脚本【绝对可用】
  2. ictclas4j java_ictclas4j 分词工具包 安装流程
  3. Zookeeper学习笔记2-------group创建、查询、删除
  4. FxCAD实验一 简单图形的绘制
  5. 华为交换机配置consol密码及vty密码
  6. windows远程桌面自动切换到360安全登录界面
  7. Dynamics crm2013 IFD部署后启用多组织
  8. 安卓兼容7.0图库选择图片生成二维码
  9. matlab读取txt数据文件
  10. MySQL 自增长主键 在删除数据后依然接着删除的数据增长