1053. Path of Equal Weight (30)
时间限制
10 ms
内存限制
65536 kB
代码长度限制
16000 B
判题程序
Standard
作者
CHEN, Yue
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 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 Figure 1.
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 = Bifor 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
N个结点,M个非叶节点,和为weight
N个结点,每个结点的值一行;
接下来M行非叶节点编号
这个编号有几个子结点,接着几个子结点的编号
要求满足从root头到尾的总值为weight;当有多条时,按照同一水平的,值大的在前面
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 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 Figure 1.
![](http://www.patest.cn/upload/5b_mj58f84v11w.jpg)
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 = Bifor 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 19Sample Output:
10 5 2 7 10 4 10 10 3 3 6 2 10 3 3 6 2
N个结点,M个非叶节点,和为weight
N个结点,每个结点的值一行;
接下来M行非叶节点编号
这个编号有几个子结点,接着几个子结点的编号
要求满足从root头到尾的总值为weight;当有多条时,按照同一水平的,值大的在前面
评测结果
时间 | 结果 | 得分 | 题目 | 语言 | 用时(ms) | 内存(kB) | 用户 |
---|---|---|---|---|---|---|---|
8月12日 18:52 | 答案正确 | 30 | 1053 | C++ (g++ 4.7.2) | 2 | 436 | datrilla |
测试点
测试点 | 结果 | 用时(ms) | 内存(kB) | 得分/满分 |
---|---|---|---|---|
0 | 答案正确 | 1 | 436 | 18/18 |
1 | 答案正确 | 1 | 436 | 3/3 |
2 | 答案正确 | 1 | 436 | 2/2 |
3 | 答案正确 | 1 | 436 | 2/2 |
4 | 答案正确 | 1 | 308 | 2/2 |
5 | 答案正确 | 2 | 308 | 3/3 |
#include<iostream> #include<vector> #include<algorithm> using namespace std; class ROOTCMP { private: vector<int>*weight; public: ROOTCMP(vector<int>*wi):weight(wi){} bool operator()(const int &A, const int&B) { return (*weight)[A] >(*weight)[B]; } }; int DuQUReadln(vector<int>*wi, vector<vector<int>>*nodes, int N, int M, vector<bool>*Noroot) { int index,temp; for (index = 0; index < N; index++) cin >> (*wi)[index]; while (M--) { cin >> index >> N; while (N--) { cin >> temp; (*Noroot)[temp] = true; (*nodes)[index].push_back(temp); } sort((*nodes)[index].begin(), (*nodes)[index].end(), ROOTCMP(wi)); } for (index = 0; index < N&&(*Noroot)[index]; index++); return index; } void PATHrootDFS(vector<int>*wi, vector<vector<int>>*nodes, vector<int>*path, int Root, int countweight, int weight) { int newroot; (*path).push_back((*wi)[Root]); vector<int>::iterator iter = (*nodes)[Root].begin(); while (iter != (*nodes)[Root].end()) { newroot = (*iter); if ((*nodes)[newroot].size() != 0) { PATHrootDFS(wi, nodes, path, newroot, countweight + (*wi)[newroot], weight); (*path).pop_back(); } else if (countweight + (*wi)[newroot] == weight) { for (vector<int>::iterator b = (*path).begin(); b < (*path).end(); b++) { cout << (*b) << " "; } cout <<(*wi)[ newroot] << endl; } iter++; } } int main() { int N, M,weight,Root; cin >> N >> M >> weight; vector<int>wi(N); vector<vector<int>>nodes(N); vector<bool>Noroot(N, false); vector<int>path; Root=DuQUReadln(&wi, &nodes, N, M, &Noroot); if (wi[Root] == weight)cout << weight << endl; else PATHrootDFS(&wi, &nodes, &path, Root, wi[Root], weight); system("pause"); return 0; }