题目链接:https://pintia.cn/problem-sets/994805342720868352/problems/994805424153280512
思路:在存储树结构的时候,把每个点的出边按从大到小排序,之后直接dfs即可。
代码:
#include <bits/stdc++.h>
using namespace std;
const int maxn = 105;
int d[maxn];
vector <int> g[maxn];
long long cnt;
int f[maxn];
int s;
bool cmp(int a,int b) {
return d[a] > d[b];
}
void dfs(int u,int cg) {
cnt += d[u];
f[cg] = d[u];
if(cnt == s && !g[u].size()) {
for(int i = 0; i <= cg; i++) {
if(i > 0)cout << " ";
cout << f[i];
}
cout << "\n";
}
else {
for(int i = 0; i < g[u].size();i++) {
int v = g[u][i];
dfs(v,cg+1);
}
}
cnt -= d[u];
}
int main() {
int n,m;
ios::sync_with_stdio(0);
cin >> n >> m >> s;
for(int i = 0; i < n; i++)cin >> d[i];
for(int i = 0; i < m; i++) {
int u,t;
cin >> u >> t;
while(t--) {
int v;
cin >> v;
g[u].push_back(v);
}
sort(g[u].begin(),g[u].end(),cmp);
}
dfs(0,0);
return 0;
}