考查DFS算法
注意点:路径要到叶子节点
#include<iostream>
#include<algorithm>
#include<vector>
#include<map>
#include<string>
#include<set>
#include<stack>
using namespace std;
const int N = 101;
int n, m, s;
int w[N];
int sum[N];//初始化和w[N]一样
vector<int> child[N];
vector<vector<int> > all_paths;
vector<int> path;
void DFS(int root){
path.push_back(w[root]);
if(sum[root] == s && child[root].empty()){
all_paths.push_back(path);
}
for(int i = 0; i < child[root].size(); i++){
sum[child[root][i]] += sum[root];
DFS(child[root][i]);
}
path.pop_back();
}
bool comp(vector<int> a, vector<int> b){
if(a > b) return true;
else return false;
}
int main(){
cin>>n>>m>>s;
for(int i = 0; i < n; i++){
scanf("%d",&w[i]);
sum[i] = w[i];
}
for(int i = 0; i < m; i++){
int fa, k;
scanf("%d%d",&fa,&k);
for(int j = 0; j < k; j++){
int tempchild;
scanf("%d",&tempchild);
child[fa].push_back(tempchild);
}
}
DFS(0);
sort(all_paths.begin(),all_paths.end(),comp);
for(int i = 0; i < all_paths.size(); i++){
for(int j = 0; j < all_paths[i].size(); j++){
if(j != 0) printf(" ");
printf("%d",all_paths[i][j]);
}
printf("\n");
}
return 0;
}