Aizu - ALDS1_7_A

2023-10-16 05:59
文章标签 aizu alds1

本文主要是介绍Aizu - ALDS1_7_A,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Rooted Trees

问题

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).


 

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.

输入

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 cc2 ... 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.

输出

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.

要求

Reference

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

ac代码

  • 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

代码

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

//不会写,望见谅,求点赞

这篇关于Aizu - ALDS1_7_A的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/219535

相关文章

Aizu - 0118(深搜)

题目链接:点击打开链接 解析: 深搜无疑,和水洼那题类似。以查找过的赋值1,然后每次找不是1的位置,一搜一片即可。最后记录多少有片区域。 完整代码: #include <cstdio>#include <cstring>#include <cstdlib>#include <algorithm>#include <iostream>#include <cmath>

Aizu 2541 Magical Bridges

题意: n个岛屿,由m条桥连接,其中有k条是魔法桥,你可以用魔法把他们变成相同长度。 求在执行魔法后,两个起点S1和S2到终点T的最短路的最小绝对差。 (1≤n≤1000,1≤m≤2000,1≤k≤100) (1\leq n\leq 1000,1\leq m\leq 2000,1\leq k\leq 100) S1 S_1和 S2 S_2到 T T的最短路将会是如 j×x+disj\t

Aizu 2538 Stack Maze【记忆化搜索】

其实我并不知道我的姿势算是什么。 一开始想着用二维的记忆化搜索,用 dp[x][y] dp[x][y]表示 (x,y)→(H,W) (x,y)\rightarrow(H,W)能够得到的最大happy值。但是很遗憾的是,这样没法记录,在前进的路上,我有多少个宝石、能够经过多少宝石洞。 所以就想着如何记录,最后发现难以记录。如果是这样的记忆化搜索,时间复杂度大约是 O(n2) O(n^2),那么就

Property Distribution Aizu - 0118

题目: タナカ氏が HW アールの果樹園を残して亡くなりました。果樹園は東西南北方向に H × W の区画に分けられ、区画ごとにリンゴ、カキ、ミカンが植えられています。タナカ氏はこんな遺言を残していました。 果樹園は区画単位でできるだけ多くの血縁者に分けること。ただし、ある区画の東西南北どれかの方向にとなりあう区画に同じ種類の果物が植えられていた場合は、区画の境界が分からないのでそれらは 1

ALDS1_5_D 2018-2-24

#include<iostream>#include<cstdio>using namespace std;const int MAX = 500000;const int maxnum = 1000000010;// 两个局部数组int L[MAX / 2 + 2], R[MAX / 2 + 2];int A[MAX], n;long long cnt ;// 排序和合并void

ALDS1_6_C 2018-2-24

#include<iostream>#include<cstdio>using namespace std;const int MAX = 100000;const int maxnum = 1000000010;struct Card {char suit;int value;};Card L[MAX / 2 + 2], R[MAX / 2 + 2];// 排序和合并void mer

ALDS1_5_C 2018-2-23

#include<iostream>#include<cstdio>#include<cmath>using namespace std;const double PI = acos(-1.0);struct Point{double x,y;};void koch(int n, Point a, Point b) {// 递归结束if (n == 0)return;// 三等分点s,t

ALDS1_4_D 2018-2-22

#include<iostream>#include<cstdio>#include<cstring>using namespace std;typedef long long LL;LL A[100000 + 10];int n, k;//模拟装货过程bool check(LL P) {int cnt = k;for (int i = 0; i < n; ) {LL t = P;

ALDS1_5_D 逆序数 2018-2-11

using namespace std;const int MAX = 500000;const int maxnum = 1000000010;// 两个局部数组int L[MAX / 2 + 2], R[MAX / 2 + 2];int A[MAX], n;long long cnt ;// 排序和合并void merge(int left, int mid, int right)

ALDS1_6_A

计数排序 执行步骤  首先将C数组下的每个元素A[i]的值累加起来,C[A[i]]++然后从前往后累加C数组,C[i] = C[i] + C[i-1],这样的累加过程实际上将数值为i的最大位置保存了,之后从最大位置往前填充数据。由于存在多个相同元素的情况,所以在输出A元素Ai前,先修正计数用的C[Ai],C[Ai]=C[Ai]−1。修正过程实际上是往前移动,因为C数组累加过程已经保证存储数字