题目:https://pintia.cn/problem-sets/994805342720868352/problems/994805424153280512
这题说不复杂也有点复杂,说复杂也不是很复杂
注意点
- 0结点是树根
- 孩子结点使用vector数组存储节省空间
- 使用sort根据权值对孩子结点进行排序,这样就可以使权值大的先遍历到,使输出符合权值递减
- 最精髓的是第33行代码,一开始我用的是push_back,导致错误,这题应该直接覆盖对应数组单位
- 记一下DFS的格式
void DFS(int root, int path_num, int sum){
代码
#include<iostream>#include<vector>#include<algorithm>using namespace std;const int maxn = 110;int n, m, s;//n是结点总数,m是非叶子结点数量,s是待求的权值和int weight[maxn];vector<int> path(maxn);struct Node{int data, weight;vector<int> child;}node[maxn];bool cmp(int a, int b){return node[a].weight > node[b].weight;}void DFS(int root, int path_num, int sum){if(sum > s) return;if(sum == s){//这个时候说明到达了叶子结点if(sum == s && node[root].child.size() != 0) return;for(int i = 0; i < path_num; i++){printf("%d",node[path[i]].weight);if(i != path_num - 1) printf(" ");}printf("\n");return;}for(int i = 0; i < node[root].child.size(); i++){int child = node[root].child[i];path[path_num] = child;DFS(child, path_num + 1, sum + node[child].weight);}}int main(){scanf("%d%d%d", &n, &m, &s);for(int i = 0; i < n; i++) scanf("%d", &node[i].weight);int tempi, leafnum,temp;for(int i = 0; i < m; i++){scanf("%d%d",&tempi, &leafnum);for(int j = 0; j < leafnum; j++){scanf("%d",&temp);node[tempi].child.push_back(temp);}sort(node[tempi].child.begin(), node[tempi].child.end(), cmp);}path.push_back(0);DFS(0, 1, node[0].weight);return 0;}
