题目

Given a non-empty tree with root R, and with weight Wi assigned to each tree node Ti. 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 Figure 1: 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 diferent 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 Figure 1.

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 < 230, the given weight number. The next line contains N positive numbers where Wi (<1000) corresponds to the tree node Ti. 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 {A1, A2, …, An} is said to be greater than sequence {B1, B2, …, Bm} if there exists 1 <= k < min{n, m} such that Ai = Bi for i=1, … k, and Ak+1 > Bk+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,求权重和等于S的路径(该路径必须是从root到叶子节点)

注:多个满足条件的路径,必须非升序打印,序列A>序列B的条件为:A1Ai与B1Bi相等,但是Ai+1>Bi+1

解题思路

  1. 定义节点结构体(权重:w,子节点cds),int path[n]记录从root到当前节点路径
  2. 题目要求权重非增序输出,每个节点的所有节点信息输入完成后,对所有子节点进行排序(权重由大到小,权重最大的节点排在最左边),深度优先遍历时会从最左边路径开始,可保证最后输出的路径满足非升序条件
  3. dfs深度优先遍历树,参数numNode记录当前path中元素的个数,参数sum记录从root到当前节点的权重和

    3.1 若权重和>s,退出不再处理该路径

    3.2 若权重和==s

    3.2.1 若当前节点是叶子节点,打印路径

    3.2.2 若当前节点是非叶子节点,退出不再处理该路径

Code

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
const int maxn=101;
int s,path[maxn];
struct node {
int w;
vector<int> cds;
} nds[maxn];
bool cmp(int a,int b) {
return nds[a].w>nds[b].w;
}
// index当前处理节点在nds中的下标,numNode当前path数组中元素个数,sum从root到当前节点权重和
void dfs(int index, int numNode, int sum) {
if(sum>s)return; //权重和超过s
if(sum==s) {
if(nds[index].cds.size()!=0)return; //权重和为s,但不是叶子节点
//满足条件,权重和为s,且为叶子节点
for(int i=0; i<numNode; i++) {
if(i!=0)printf(" ");
printf("%d",nds[path[i]].w);
if(i==numNode-1)printf("\n");
}
return;
}
for(int i=0; i<nds[index].cds.size(); i++) {
int cdi = nds[index].cds[i]; //子节点在nds中的下标
path[numNode] = cdi;
dfs(cdi, numNode+1, sum+nds[cdi].w);
}
}
int main(int argc,char * argv[]) {
int n,m,cn,id,cid;
scanf("%d %d %d",&n,&m,&s);
for(int i=0; i<n; i++) {
scanf("%d",&nds[i].w);
}
for(int i=0; i<m; i++) {
scanf("%d %d",&id,&cn);
for(int j=0; j<cn; j++) {
scanf("%d",&cid);
nds[id].cds.push_back(cid);
}
sort(nds[id].cds.begin(),nds[id].cds.end(),cmp);
}
path[0]=0;
dfs(0,1,nds[0].w);
return 0;
}

PAT Advanced 1053 Path of Equal Weight (30) [树的遍历]的更多相关文章

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

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

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

  3. 【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 ...

  4. PAT (Advanced Level) 1053. Path of Equal Weight (30)

    简单DFS #include<cstdio> #include<cstring> #include<cmath> #include<vector> #i ...

  5. 【PAT甲级】1053 Path of Equal Weight (30 分)(DFS)

    题意: 输入三个正整数N,M,S(N<=100,M<N,S<=2^30)分别代表数的结点个数,非叶子结点个数和需要查询的值,接下来输入N个正整数(<1000)代表每个结点的权重 ...

  6. PAT甲题题解-1053. Path of Equal Weight (30)-dfs

    由于最后输出的路径排序是降序输出,相当于dfs的时候应该先遍历w最大的子节点. 链式前向星的遍历是从最后add的子节点开始,最后添加的应该是w最大的子节点, 因此建树的时候先对child按w从小到大排 ...

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

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

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

随机推荐

  1. Java 布尔运算

    章节 Java 基础 Java 简介 Java 环境搭建 Java 基本语法 Java 注释 Java 变量 Java 数据类型 Java 字符串 Java 类型转换 Java 运算符 Java 字符 ...

  2. P1081 检查密码

    P1081 检查密码 转跳点:

  3. node - 获取当前时间并格式化

    1,安装 moment模块 cnpm i moment --save 2,引入 var moment = require('moment'); 3,获取当前时间并格式化 var current_tim ...

  4. oracle查询SQL优化相当重要

    如果表中的时间字段是索引,那么时间字段不要使用函数,函数会使索引失效. 例如: select * from mytable where trunc(createtime)=trunc(sysdate) ...

  5. 1. Centos 安装

    安装 Centos 6.9 配置网络 vi /etc/sysconfig/network-scripts/ifcfg-eth0 DEVICE=eth0 TYPE=Ethernet ONBOOT=yes ...

  6. check Linux文件夹个数

    (ls -l|grep "^-"| wc -l)查看某个文件夹下文件的个数.(ls -lR|grep "^-"| wc -l)查看某个文件夹下文件的个数,包括子 ...

  7. 【剑指Offer】面试题10- II. 青蛙跳台阶问题

    题目 一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶.求该青蛙跳上一个 n 级的台阶总共有多少种跳法. 答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返 ...

  8. 【剑指Offer】面试题52. 两个链表的第一个公共节点

    题目 输入两个链表,找出它们的第一个公共节点. 如下面的两个链表: 在节点 c1 开始相交. 示例 1: 输入:intersectVal = 8, listA = [4,1,8,4,5], listB ...

  9. UVA - 10570 Meeting with Aliens(外星人聚会)(暴力枚举)

    题意:输入1~n的一个排列(3<=n<=500),每次可以交换两个整数.用最少的交换次数把排列变成1~n的一个环状序列. 分析:正序反序皆可.枚举每一个起点,求最少交换次数,取最小值. 求 ...

  10. JS ~ Promise.reject()

    概述: Promise.reject(reason)方法返回一个带有拒绝原因reason参数的Promise对象. 语法 Promise.reject(reason); reason :  表示Pro ...