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. 建立結(jié)構(gòu)體,存儲權(quán)值,還有孩子。
2. 進(jìn)行dfs,中間要加入權(quán)重值和的計(jì)算判斷。?
3. 進(jìn)行代碼實(shí)現(xiàn)的時候,dfs又把自己繞暈進(jìn)去...我好想哭啊,遞歸怎么這么難寫...下午按照柳神的思路再寫一遍把!
?
柳神:
1. 在錄入樹的結(jié)點(diǎn)的時候就進(jìn)行排序,以便深搜的時候直接從大到小輸出。第一次見到這種cmp函數(shù)的書寫方式誒,感覺學(xué)到了!!
2. 還有就是控制輸出那個地方,也很新奇,值得學(xué)習(xí)!
3.?path數(shù)組,傳入一個nodeNum記錄對當(dāng)前路徑來說這是第幾個結(jié)點(diǎn)(這樣直接在path[nodeNum]里面存儲當(dāng)前結(jié)點(diǎn)的孩子結(jié)點(diǎn)的序號,這樣可以保證在先判斷return的時候,path是從0~numNum-1的值確實(shí)是要求的路徑結(jié)點(diǎn))。然后每次要遍歷下一個孩子結(jié)點(diǎn)的之前,令path[nodeNum] = 孩子結(jié)點(diǎn)的序號,這樣就保證了在return的時候當(dāng)前path里面從0~nodeNum-1的值就是要輸出的路徑的結(jié)點(diǎn)序號,輸出這個序號的權(quán)值即可,直接在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; //沒有到葉子結(jié)點(diǎn),返回for(int i = 0; i < nodeNum; i++) //到了葉子結(jié)點(diǎn)并且權(quán)值一樣,進(jìn)行輸出printf("%d%c", v[path[i]].w, i != nodeNum - 1 ? ' ' : '\n');return ;}for(int i = 0; i < v[index].child.size(); i++) { //遞歸訪問孩子結(jié)點(diǎn)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; }?
總結(jié)
以上是生活随笔為你收集整理的PAT甲级 -- 1053 Path of Equal Weight (30 分)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PAT甲级 -- 1079 Total
- 下一篇: 蓝桥杯 ADV-205 算法提高 拿糖果