建树建好后,使用DFS就能找到答案,另外题目要求结果路径的最后一个结点一定要是叶子结点,最后得到结果后,简单的排下序就行了。
#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <vector>
using namespace std;
struct node{
int weight;
vector<int> child;
};
vector<vector<int>> vt;
vector<int> result;
bool cmpVector(vector<int> v1,vector<int> v2){
int i=0;
while(i<v1.size() && i<v2.size()){
if(v1[i] != v2[i]){
return v1[i] > v2[i];
}
i++;
}
return false;
}
struct node tree[110];
int s;
void DFS(int index,int sum){
if(sum > s) return;
if(sum == s){
if(tree[index].child.size() == 0){
vt.push_back(result);
}
return;
}
for(int i=0;i<tree[index].child.size();i++){
int child_index = tree[index].child[i];
sum+=tree[child_index].weight;
result.push_back(tree[child_index].weight);
DFS(child_index,sum);
sum -=tree[child_index].weight;
result.pop_back();
}
}
int main()
{
int n,m;
scanf("%d%d%d",&n,&m,&s);
for(int i=0;i<n;i++){
scanf("%d",&tree[i].weight);
}
for(int i=0;i<m;i++){
int index,k;
scanf("%d%d",&index,&k);
for(int j=0;j<k;j++){
int child;
scanf("%d",&child);
tree[index].child.push_back(child);
}
}
result.push_back(tree[0].weight);
//DFS寻找结果
DFS(0,tree[0].weight);
//结果排序
sort(vt.begin(),vt.end(),cmpVector);
//输出
for(int i=0;i<vt.size();i++){
vector<int> temp = vt[i];
for(int j=0;j<temp.size()-1;j++)
printf("%d ",temp[j]);
if(temp.size()-1>=0)
printf("%d\n",temp[temp.size()-1]);
}
return 0;
}