传送门
1.树的遍历
2.dfs
3.按权值排序
#include<bits/stdc++.h>
using namespace std;
vector<vector < int > > tree,ans;
vector<int > weight,tpans;
vector<bool > vis;
int n,m;
long long val;
bool cmp(int a,int b)
{
//为保证输出是按路径权值降序的
return weight[a] > weight[b];
}
//dfs遍历每条路径,寻找符合条件得路径
void dfs(int root,long long sum)
{
sum += weight[root];
tpans.push_back(weight[root]);
//达到树叶
if(vis[root]==false){
if(sum==val){
ans.push_back(tpans);
}
//回溯
tpans.pop_back();
return;
}
for(int i=0;i<tree[root].size();i++){
dfs(tree[root][i],sum);
}
//回溯
tpans.pop_back();
}
int main()
{
scanf("%d%d%lld",&n,&m,&val);
weight.resize(n);
vis.resize(n);
tree.resize(n);
for(int i=0;i<n;i++){
scanf("%d",&weight[i]);
}
int k,tp;
for(int i=0;i<m;i++){
scanf("%d%d",&tp,&k);
vis[tp] = true;
tree[tp].resize(k);
for(int j=0;j<k;j++){
scanf("%d",&tree[tp][j]);
}
//每个儿子按权值从大到小排序
sort(tree[tp].begin(),tree[tp].end(),cmp);
}
dfs(0,0);
for(int i=0;i<ans.size();i++){
printf("%d",ans[i][0]);
for(int j=1;j<ans[i].size();j++)
{
printf(" %d",ans[i][j]);
}
printf("\n");
}
return 0;
}