【题意】
给定一棵树,各个节点有编号及权值,再给出一个目标权值,找到所有从根节点到叶节点且权值之和等于目标权值的路径。路径需要按照权值的非递增顺序输出
【思路】
从根开始DFS即可。需要注意的是输出要按照权值的非递增顺序,所以对于每个读入的非叶节点的子节点列表,要按照权值的非递减顺序排序,然后再开始DFS
#include <iostream>
#include <map>
#include <vector>
#include <algorithm>
#include <stack>
using namespace std;
vector<int> weights;
map<int,vector<int>> nonLeafNodes;
map<int,int> preNode;
bool cmp(int a, int b){
return weights[a]>weights[b];
}
void dfs(int index, int restWeight){
restWeight -= weights[index];
if(nonLeafNodes.find(index)!=nonLeafNodes.end()){
for(vector<int>::iterator it=nonLeafNodes[index].begin(); it!=nonLeafNodes[index].end(); it++){
if(weights[*it]<=restWeight){
dfs(*it,restWeight);
}
}
}
else{
if(restWeight==0){
stack<int> path;
while(index){
path.push(weights[index]);
index = preNode[index];
}
cout << weights[0];
while(!path.empty()){
cout << " " << path.top();
path.pop();
}
cout << endl;
}
}
}
int main(int argc, char const *argv[])
{
int n,m,target;
cin >> n >> m >> target;
weights.resize(n);
for(int i=0; i<n; i++){
cin >> weights[i];
}
for(int i=0; i<m; i++){
int id,k,childrenId;
vector<int> children;
cin >> id >> k;
for(int j=0; j<k; j++){
cin >> childrenId;
children.push_back(childrenId);
preNode[childrenId] = id;
}
sort(children.begin(),children.end(),cmp);
nonLeafNodes[id] = children;
}
dfs(0,target);
system("pause");
return 0;
}