给定一棵带权树,求根节点到叶节点等于给定数的带权路径,降序输出。
考虑在输入的时候进行降序排序
渣渣如我已经忘了dfs怎么用回溯存路径了。。
#include <iostream>
#include<bits/stdc++.h>
#define rep(i,a,n) for(int i=a;i<n;i++)
#define sca(x) scanf("%d",&x)
#define sca2(x,y) scanf("%d%d",&x,&y)
#define scl(x) scanf("%lld",&x)
#define pri(x) printf("%d\n",x)
#define pri2(x,y) printf("%d %d\n",x,y)
#define prs(x) printf("%s\n",(x))
#define prl(x) printf("%lld\n",x)
#define ll long long
#define PII pair<int,int>
#define eps 1e-6
#define inf 1e17
#define INF 0x3f3f3f3f
using namespace std;
const int maxn=1e3+5;
struct node{
int son[maxn];
int sz;
}tree[maxn];
int a[maxn];
int n,m,sum;
int id,s,t;
vector<int> ans;
void dfs(int root,int tot){
if(tot>sum) {
return;
}
if(tree[root].sz==0){
if(tot==sum){
for(int i=0;i<ans.size();i++){
printf("%d%c",ans[i],i==ans.size()-1?'\n':' ');
}
}
return ;
}
rep(i,0,tree[root].sz){
int nxt=tree[root].son[i];
ans.push_back(a[nxt]);
dfs(nxt,tot+a[nxt]);
ans.pop_back();
}
}
bool cmp(int x,int y){
return a[x]>a[y];
}
int main(){
cin>>n>>m>>sum;
rep(i,0,n)sca(a[i]);
while(m--){
cin>>id>>t;
tree[id].sz=t;
rep(i,0,t){
cin>>s;
tree[id].son[i]=s;
}
sort(tree[id].son,tree[id].son+tree[id].sz,cmp);
}
ans.push_back(a[0]);
dfs(0,a[0]);
}