Given a non-empty tree with root R, and with weight W​i​​ assigned to each tree node T​i​​. The weight of a path from R to L is defined to be the sum of the weights of all the nodes along the path from R to any leaf node L.

Now given any weighted tree, you are supposed to find all the paths with their weights equal to a given number. For example, let's consider the tree showed in the following figure: for each node, the upper number is the node ID which is a two-digit number, and the lower number is the weight of that node. Suppose that the given number is 24, then there exists 4 different paths which have the same given weight: {10 5 2 7}, {10 4 10}, {10 3 3 6 2} and {10 3 3 6 2}, which correspond to the red edges in the figure.

Input Specification:

Each input file contains one test case. Each case starts with a line containing 0, the number of nodes in a tree, M (<), the number of non-leaf nodes, and 0, the given weight number. The next line contains N positive numbers where W​i​​ (<) corresponds to the tree node T​i​​. Then M lines follow, each in the format:

ID K ID[1] ID[2] ... ID[K]
 

where ID is a two-digit number representing a given non-leaf node, K is the number of its children, followed by a sequence of two-digit ID's of its children. For the sake of simplicity, let us fix the root ID to be 00.

Output Specification:

For each test case, print all the paths with weight S in non-increasing order. Each path occupies a line with printed weights from the root to the leaf in order. All the numbers must be separated by a space with no extra space at the end of the line.

Note: sequence { is said to be greater than sequence { if there exists 1 such that A​i​​=B​i​​ for ,, and A​k+1​​>B​k+1​​.

Sample Input:

20 9 24
10 2 4 3 5 10 2 18 9 7 2 2 1 3 12 1 8 6 2 2
00 4 01 02 03 04
02 1 05
04 2 06 07
03 3 11 12 13
06 1 09
07 2 08 10
16 1 15
13 3 14 16 17
17 2 18 19
 

Sample Output:

10 5 2 7
10 4 10
10 3 3 6 2
10 3 3 6 2

题意:

  给出一棵树,每个节点既有编号又有权值,找出所有从根节点到叶子结点权值之和等于s的所有路径。

思路:

  构造一个结构体,结构体中既有权重又有孩子结点,同时还有当前结点到达根节点的权重之和。其实寻找路径比较好找,我们用简单的DFS就能够把路径找到,但是问题要求输出的路径按照降序输出,看了别人的代码后,发现,在遍历孩子结点的时候如果我们能够保证孩子结点是由大到小的顺序,那么路径也就一定是由大到小的顺序。明白了只一点,这道题就简单了。

Code:

 1 #include <bits/stdc++.h>
2
3 using namespace std;
4
5 struct Node {
6 int val;
7 vector<int> sons;
8 int father = -1;
9 int sum = 0;
10 };
11
12 vector<int> leaf;
13 vector<Node> v;
14
15 bool cmp(int a, int b) { return v[a].val > v[b].val; }
16
17 void DFS(int index, int s) {
18 if (v[index].father != -1) {
19 int father = v[index].father;
20 v[index].sum = v[father].sum + v[index].val;
21 }
22 if (v[index].sons.size() == 0) {
23 if (v[index].sum == s) {
24 vector<int> path;
25 while (v[index].father != -1) {
26 path.push_back(v[index].val);
27 index = v[index].father;
28 }
29 path.push_back(v[index].val);
30 reverse(path.begin(), path.end());
31 for (int i = 0; i < path.size(); ++i) {
32 if (i == 0)
33 cout << path[i];
34 else
35 cout << " " << path[i];
36 }
37 cout << endl;
38 }
39 return;
40 }
41 for (int son : v[index].sons) DFS(son, s);
42 }
43
44 int main() {
45 int n, m;
46 long long s;
47 cin >> n >> m >> s;
48 v.resize(n);
49 for (int i = 0; i < n; ++i) {
50 cin >> v[i].val;
51 v[i].sum = v[i].val;
52 }
53 for (int i = 0; i < m; ++i) {
54 int index, k, son;
55 cin >> index >> k;
56 v[index].sum = v[index].val;
57 for (int j = 0; j < k; ++j) {
58 cin >> son;
59 v[index].sons.push_back(son);
60 v[son].father = index;
61 }
62 sort(v[index].sons.begin(), v[index].sons.end(), cmp);
63 }
64 DFS(0, s);
65 return 0;
66 }

1053 Path of Equal Weight的更多相关文章

  1. 【PAT】1053 Path of Equal Weight(30 分)

    1053 Path of Equal Weight(30 分) Given a non-empty tree with root R, and with weight W​i​​ assigned t ...

  2. PAT 1053 Path of Equal Weight[比较]

    1053 Path of Equal Weight(30 分) Given a non-empty tree with root R, and with weight W​i​​ assigned t ...

  3. pat 甲级 1053. Path of Equal Weight (30)

    1053. Path of Equal Weight (30) 时间限制 100 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue ...

  4. PAT 甲级 1053 Path of Equal Weight (30 分)(dfs,vector内元素排序,有一小坑点)

    1053 Path of Equal Weight (30 分)   Given a non-empty tree with root R, and with weight W​i​​ assigne ...

  5. 1053 Path of Equal Weight——PAT甲级真题

    1053 Path of Equal Weight 给定一个非空的树,树根为 RR. 树中每个节点 TiTi 的权重为 WiWi. 从 RR 到 LL 的路径权重定义为从根节点 RR 到任何叶节点 L ...

  6. 1053. Path of Equal Weight (30)

    Given a non-empty tree with root R, and with weight Wi assigned to each tree node Ti. The weight of ...

  7. 1053 Path of Equal Weight (30 分)

    Given a non-empty tree with root R, and with weight W​i​​ assigned to each tree node T​i​​. The weig ...

  8. PAT 1053 Path of Equal Weight

    #include <cstdio> #include <cstdlib> #include <vector> #include <algorithm> ...

  9. 1053 Path of Equal Weight (30)(30 分)

    Given a non-empty tree with root R, and with weight W~i~ assigned to each tree node T~i~. The weight ...

  10. PAT Advanced 1053 Path of Equal Weight (30) [树的遍历]

    题目 Given a non-empty tree with root R, and with weight Wi assigned to each tree node Ti. The weight ...

随机推荐

  1. RabbitMQ-RPC版主机管理程序

    一.作业需求 1.可以对指定机器异步的执行多个命令 例子: 请输入操作指令>>>:run ipconfig --host 127.0.0.0 in the call     tack ...

  2. 在Arch上使用Fcitx5

    目录 卸载Fcitx4 安装Fcitx5 配置 修改环境变量 系统登陆后默认启动Fcitx5输入法 配置主题 最终使用效果 参考文档 我是一个Arch+KDE的用户,所以下面的方法可能不适合所有的Li ...

  3. Linux Kernel 0.12 启动简介,调试记录(Ubuntu1804, Bochs, gdb)

    PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 前置说明   本文作为本人csdn blog的主站的备份.(Bl ...

  4. .NET 5学习笔记(11)—— Host Blazor WebAssembly in a Windows Service

    实在是被某软忽悠瘸了,愤而写此一篇.希望能让同样需求的同学们少走弯路.某软在<在 Windows 服务中托管 ASP.NET Core>中,介绍了通过创建Worker Service工程, ...

  5. python基础学习之类的属性 增删改查

    类中的属性如何在类外部使用代码进行增删改查呢 增加.改变: setattr内置函数以及 __setattr__魔法方法 class A: aaa = '疏楼龙宿' a = A() setattr(a, ...

  6. gtk中构件添加背景图

    在gtk中我们总想要去给构件添加背景图,具体函数代码如下 void chang_background(GtkWidget *widget, int w, int h, const gcha r *pa ...

  7. concurrentHashMap扩容相关方法详解

    上一个博客中说到了concurrentHashMap的put操作,在put操作之后如果添加了节点,我们首先会把全局的节点数+1,如果满足了扩容条件,我们则进行扩容 我们先从addCount方法说起 / ...

  8. 复制粘贴Ctrl+C改为自定义单键

    目录 那一瞬间不想用Ctrl+C了 (一)搜索渠道 关键词搜索 (二)方案对比 (三)最终方案Ditto 使用方法 (四)案例 1. 替换Ctrl+C快捷键: 2. 将英文小写替换为大写: 那一瞬间不 ...

  9. 依赖反转原则DIP 与使用了Repository模式的asp.net core项目结构

    DIP 依赖反转原则 Dependency Inversion Principle 的定义如下: 高级别的模块不应该依赖于低级别的模块, 他们都应该依赖于抽象. 假设Controller依赖于Repo ...

  10. CMS前世今生

    CMS一直是面试中的常考点,今天我们用通俗易懂的语言简单介绍下. 垃圾回收器为什么要分区分代? 如上图:JVM虚拟机将堆内存区域分代了,先生代是朝生夕死的区域,老年代是老不死的区域,不同的年代对象有不 ...