pat-1053

题目

Path of Equal Weight
https://pintia.cn/problem-sets/994805342720868352/problems/994805424153280512

分析

题目求解从Root到Leaves,即从根节点到叶子节点中,路径上总w等于target的路径,输出要求,字典序大在前

关键在于怎么写dfs和过程中如何输出答案

dfs中利用nodeNum来累计当前所在的层数,利用path保存便利过程中的路径

代码


#include<algorithm>
#include<iostream>
#include<cstdio>
using namespace std;

struct {
int w;
vector<int> child;
};

int n,m,target;
vector<Node> node;
vector<int> path;

bool cmp(int a,int b){
return node[a].w>node[b].w;
}

void dfs(int index,int nodeNum,int sum){
if(sum>target){
return ;
}
if(sum==target){
if(node[index].child.size()!=0){
return ;
}
for(int i=0;i<nodeNum;i++){
printf("%d%c",node[path[i]].w,i != nodeNum-1 ? ' ':'n');
}
return ;
}
for(int i=0;i<node[index].child.size();i++){
int child=node[index].child[i];
path[nodeNum]=child;
dfs(child,nodeNum+1,sum+node[child].w);
}
}

int main(){
scanf("%d%d%d",&n,&m,&target);
node.resize(n);
path.resize(n);
for(int i=0;i<n;i++){
scanf("%d",&node[i].w);
}
int tem,cnt;
for(int i=0;i<m;i++){
scanf("%d%d",&tem,&cnt);
node[tem].child.resize(cnt);
for(int j=0;j<cnt;j++){
scanf("%d",&node[tem].child[j]);
}
sort(node[tem].child.begin(),node[tem].child.end(),cmp);
}
dfs(0,1,node[0].w);
return 0;
}