Given a non-empty tree with root , and with weight $W_i$ assigned to each tree node $T_i$. The weight of a path from to is defined to be the sum of the weights of all the nodes along the path from to any leaf node .
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 , the number of nodes in a tree, (), the number of non-leaf nodes, and $0 < S < 2^{30}$, the given weight number. The next line contains positive numbers where $W_i$() corresponds to the tree node $T_i$. Then 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\leq 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
#include<iostream> #include<algorithm> #include<vector> using namespace std; int N;//节点数量 int M;//非叶节点数量 int S;//所得权重 struct Node {//孩子表示法 int weight; vector child; }nodes[110];//下标表示节点编号 //int path[110];//记录路径 vector<vector > path; vector temp; void DFS(int index, int len, int sum) {//index当前访问节点,len当前路径长,sum当前路径权重 temp.push_back(index); sum += nodes[index].weight; len++; if (sum > S)return;//加上次节点后大于S,此路不通 if (sum == S) { if (nodes[temp[len - 1]].child.empty() != 1)return;//有叶节点但sum==S,则表示此路不通 path.push_back(temp); return; } if (sum < S) { for (int i = 0; i < nodes[temp[len - 1]].child.size(); i++) { DFS(nodes[temp[len - 1]].child[i], len, sum); temp.pop_back(); } } } bool cmp(vector a, vector b) { int len_a = a.size(); int len_b = b.size(); int index = 0; while (index < len_a && index < len_b) { if (nodes[a[index]].weight != nodes[b[index]].weight) return nodes[a[index]].weight > nodes[b[index]].weight; index++; } return len_a > len_b; } int main() { cin >> N; cin >> M; cin >> S; for (int i = 0; i < N; i++) { cin >> nodes[i].weight; } int non_leaf; int child_num; int child; for (int i = 1; i <= M; i++) { cin >> non_leaf; cin >> child_num; for (int j = 0; j < child_num; j++) { cin >> child; nodes[non_leaf].child.push_back(child); } //sort(nodes[non_leaf].child.begin(), nodes[non_leaf].child.end(), cmp); } DFS(0, 0, 0); sort(path.begin(), path.end(), cmp); for (int i = 0; i < path.size(); i++) { for (int j = 0; j < path[i].size(); j++) { cout << nodes[path[i][j]].weight; if (j < path[i].size() - 1)cout << ' '; else cout << endl; } } }
最新评论