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<N≤100, the number of nodes in a tree, M (<N), the number of non-leaf nodes, and 0<S<2​30​​, the given weight number. The next line contains N positive numbers where W​i​​ (<1000) 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 {A​1​​,A​2​​,⋯,A​n​​} is said to be greater than sequence {B​1​​,B​2​​,⋯,B​m​​} if there exists 1≤k<min{n,m} such that A​i​​=B​i​​ for i=1,⋯,k, 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

总结:

  1. 用静态树的构造逻辑上还是比较清晰的,就是一个数组,然后数组下有若干个子结点,通过子结点的数值找到数组中下标
  2. 这里的树和二叉树的不同之处在于,二叉树只有两个子结点,而树的子结点是不确定的,基于此,在构造结构的时候把子结点构造为用vector容器来存储,并用push_back和pop_back来插入删除
  3. 一般来说,输出的时候是要排序的,可能按结点的权重从大到小或者从小到大,本题给出一种思路,就是在输入的时候就把子结点按权重按要求排好序,这样在输出的时候就可以直接输出了。
  4. 在DFS中,首先要设置边界
  5. 一般来说,要有一个记录路径多少的数,这是为了输出方便,因为数与数之间需要用空格隔开,但是最后一个数后面不许出现空格。这就要求要做一个判别,这里用sumNode来判别的
  6. DFS是一个递归的结构

代码:

#include <stdio.h>
#include <vector>
#include <algorithm>
using namespace std;
const int maxn=110;
int total,row,sum;
int path[maxn];  //路径
struct Node{int data;vector<int> child;
}node[maxn];bool cmp(int a,int b){  //提前排序,有助于按降序输出 return node[a].data>node[b].data;
}
void DFS(int index,int sumNode,int s){  //结点,路径中的个数,和 if(s>sum) return;if(s==sum){if(node[index].child.size()!=0) return;for(int i=0;i<sumNode;i++){printf("%d",node[path[i]].data);if(i<sumNode-1) printf(" ");else printf("\n");}return;}for(int i=0;i<node[index].child.size();i++){int child=node[index].child[i];path[sumNode]=child;DFS(child,sumNode+1,s+node[child].data);}
}
int main(){scanf("%d%d%d",&total,&row,&sum);for(int i=0;i<total;i++){scanf("%d",&node[i].data);}int id,num,child;for(int i=0;i<row;i++){scanf("%d %d",&id,&num);for(int j=0;j<num;j++){scanf("%d",&child);node[id].child.push_back(child);}sort(node[id].child.begin(),node[id].child.end(),cmp);  //先对整个子树按权重从左到右由大向小排序,那之后的输出就不必再作比较了 }path[0]=0;//存放结点DFS(0,1,node[0].data); return 0;
} 

【PAT】A1053 Path of Equal Weight相关推荐

  1. PAT甲级1053 Path of Equal Weight (30分) :[C++题解]dfs求树的路径长度、邻接表

    文章目录 题目分析 题目链接 题目分析 输入样例: 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 ...

  2. PAT:1053. Path of Equal Weight (30) AC

    #include<stdio.h> #include<vector> #include<queue> #include<algorithm> using ...

  3. [PAT] A1053 Path of Equal Weight

    (要熟练!)(树的遍历) 题目大意 (题目链接)https://pintia.cn/problem-sets/994805342720868352/problems/99480542415328051 ...

  4. PAT A1053 Path of Equal Weight [树的DFS遍历]

    题目描述 链接 给出树的结构和权值,找从根结点到叶子结点的路径上的权值相加之和等于给定目标数的路径,并且从大到小输出路径 分析 静态数组建树 dfs遍历:注意什么地方要回溯状态 二维数组排序,基本用v ...

  5. PAT甲级 -- 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 ...

  6. 【PAT】A1060 Are They Equal *

    If a machine can save only 3 significant digits, the float numbers 12300 and 12358.9 are considered ...

  7. 【PAT】A1079 Total Sales of Supply Chain

    A supply chain is a network of retailers(零售商), distributors(经销商), and suppliers(供应商)-- everyone invo ...

  8. 【置顶】【PAT】PAT甲级题目及分类总结(持续更新ing)

    在2019年3月底,我决定考浙大计院,经过一个月还算凑合的学习,痛定思痛,决定整理整理自己的博客. 粗略估计,大概一个月的时间里我AC了31道题,大概用时40个小时上下,毕竟还要把大部分时间花在笔试上 ...

  9. PAT (Advanced Level) Practice 1053 Path of Equal Weight (30 分)

    1053 Path of Equal Weight (30 分) Given a non-empty tree with root R, and with weight Wi assigned to ...

最新文章

  1. python接口测试上传文件_python https 接口测试 上传文件
  2. CSDN Github Markdown编辑常用功能符号补充
  3. VTK:多重渲染窗口用法实战
  4. Markdown会干掉Html吗?
  5. TCP面向连接中的“连接”和“可靠”与“不可靠”
  6. counting sort (计数排序) algorithm
  7. 使用 做签名的post_腾讯IMWeb团队是如何使用 NodeJS 实现 JWT 原理
  8. Helm 3 完整教程(六):在模板中使用 Helm 函数
  9. 二十一天学通之cookie的路径和域
  10. memcache 未授权访问漏洞
  11. SharePoint 2010工作流系列(2):SharePoint Designer 2010中工作流的条件和操作概览
  12. elasticsearch的keyword与text的区别
  13. 登陆界面输入框内加入小图标的样式
  14. 皮线光缆和预制成端皮线光缆招标采购技术标准
  15. 电信机顶盒中心服务器连接异常,电信电视盒子连不上网的解决方法
  16. 2022软考网工笔记(网络安全)
  17. UE4TTS文字转语音功能。
  18. NVIDIA Jetson AGX Orin的计算能力
  19. JAVA编写PTA(10分)
  20. android手机root status,相应黑科技梳理

热门文章

  1. 对于DataSet中的问题真是郁闷啊
  2. CentOS 7安装 ifconfig 管理命令
  3. java面试题3(java基础)
  4. javaWeb_JSP 动态指令 forward 的程序
  5. [BUUCTF]Reverse——[网鼎杯 2020 青龙组]jocker
  6. Kubernetes实用技巧
  7. [ATF]-ATF makefile的导读
  8. linux kernel中的cmdline的详细介绍
  9. Elementui icon图标不显示
  10. MySQL的主从复制主从同步