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?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 19Sample Output:
10 5 2 7 10 4 10 10 3 3 6 2 10 3 3 6 2Special thanks to Zhang Yuan and Yang Han for their contribution to the judge's data.
我的思路:
1. 建立結構體,存儲權值,還有孩子。
2. 進行dfs,中間要加入權重值和的計算判斷。?
3. 進行代碼實現的時候,dfs又把自己繞暈進去...我好想哭啊,遞歸怎么這么難寫...下午按照柳神的思路再寫一遍把!
?
柳神:
1. 在錄入樹的結點的時候就進行排序,以便深搜的時候直接從大到小輸出。第一次見到這種cmp函數的書寫方式誒,感覺學到了!!
2. 還有就是控制輸出那個地方,也很新奇,值得學習!
3.?path數組,傳入一個nodeNum記錄對當前路徑來說這是第幾個結點(這樣直接在path[nodeNum]里面存儲當前結點的孩子結點的序號,這樣可以保證在先判斷return的時候,path是從0~numNum-1的值確實是要求的路徑結點)。然后每次要遍歷下一個孩子結點的之前,令path[nodeNum] = 孩子結點的序號,這樣就保證了在return的時候當前path里面從0~nodeNum-1的值就是要輸出的路徑的結點序號,輸出這個序號的權值即可,直接在return語句里面輸出。
#include <iostream> #include <vector> #include <algorithm> using namespace std; int target; struct NODE {int w;vector<int> child; }; vector<NODE> v; vector<int> path; void dfs(int index, int nodeNum, int sum) {if(sum > target) return ;if(sum == target) {if(v[index].child.size() != 0) return; //沒有到葉子結點,返回for(int i = 0; i < nodeNum; i++) //到了葉子結點并且權值一樣,進行輸出printf("%d%c", v[path[i]].w, i != nodeNum - 1 ? ' ' : '\n');return ;}for(int i = 0; i < v[index].child.size(); i++) { //遞歸訪問孩子結點int node = v[index].child[i];path[nodeNum] = node;dfs(node, nodeNum + 1, sum + v[node].w);}} int cmp1(int a, int b) {return v[a].w > v[b].w; } int main() {int n, m, node, k;scanf("%d %d %d", &n, &m, &target);v.resize(n), path.resize(n);for(int i = 0; i < n; i++)scanf("%d", &v[i].w);for(int i = 0; i < m; i++) {scanf("%d %d", &node, &k);v[node].child.resize(k);for(int j = 0; j < k; j++)scanf("%d", &v[node].child[j]);sort(v[node].child.begin(), v[node].child.end(), cmp1);}dfs(0, 1, v[0].w);return 0; }?
總結
以上是生活随笔為你收集整理的PAT甲级 -- 1053 Path of Equal Weight (30 分)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PAT甲级 -- 1079 Total
- 下一篇: 蓝桥杯 ADV-205 算法提高 拿糖果