dfs遍历树,求路径中结点的权重和,
最后按照路径权重排序输出
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int s;
struct node
{
int w;
vector<int> children;
}T[100];
vector<vector<int> > path;
void dfs(int root,int this_w,vector<int> &each_path){//放在参数中,每次dfs()后不用恢复值
if(this_w>s) return;
if(T[root].children.size()==0 && this_w==s){
path.push_back(each_path);
return;
}
for(int i=0;i<T[root].children.size();i++){
int this_node=T[root].children[i];
each_path.push_back(T[this_node].w);//从nodeNum=0开始的
dfs(this_node,this_w+T[this_node].w,each_path);
each_path.pop_back();
}
}
int main(){
int n,m;
scanf("%d %d %d",&n,&m,&s);
for(int i=0;i<n;i++) scanf("%d",&T[i].w);
int tmp_id,k,tmp_child;
for(int i=0;i<m;i++){
scanf("%02d %d",&tmp_id,&k);
while(k--){
scanf("%02d",&tmp_child);
T[tmp_id].children.push_back(tmp_child);
}
}
vector<int> each_path;
each_path.push_back(T[0].w);
dfs(0,T[0].w,each_path);
//注意必须二级排序,否则后面结点的weight会影响当前path的weight
sort(path.begin(),path.end(),greater<vector<int> >());
for(int i=0;i<path.size();i++){
for(int j=0;j<path[i].size();j++){
printf("%d%s",path[i][j],j==(path[i].size()-1)?"":" ");
}
printf("\n");
}
return 0;
}
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int s;
struct node
{
int w;
vector<int> children;
}T[100];
vector<int> path;
int this_w=0,nodeNum=-1;
void dfs(int root){
if(this_w>s) return;
if(T[root].children.size()==0){
this_w+=T[root].w,nodeNum+=1;
if(this_w==s){
//path.push_back(T[root].w);后面必须clear()
path[nodeNum]=T[root].w;
int flag_path=0;
for(int i=0;i<=nodeNum;i++){
printf("%s%d",flag_path==1?" ":"",path[i]);
flag_path=1;
}
printf("\n");
}
this_w-=T[root].w,nodeNum-=1;
return;
}
for(int i=0;i<T[root].children.size();i++){
this_w+=T[root].w,nodeNum+=1;
//path.push_back(T[root].w);后面必须pop_back
path[nodeNum]=T[root].w;//从nodeNum=0开始的
dfs(T[root].children[i]);
this_w-=T[root].w,nodeNum-=1;
}
}
bool cmp1(int a,int b){
return T[a].w>T[b].w;
}
int main(){
int n,m;
scanf("%d %d %d",&n,&m,&s);
path.resize(n+1);
for(int i=0;i<n;i++) scanf("%d",&T[i].w);
int tmp_id,k,tmp_child;
for(int i=0;i<m;i++){
scanf("%02d %d",&tmp_id,&k);
while(k--){
scanf("%02d",&tmp_child);
T[tmp_id].children.push_back(tmp_child);
}
//只能保证一级权重【最后一个点过不了】,必须要二级排序
sort(T[tmp_id].children.begin(),T[tmp_id].children.end(),cmp1);
}
dfs(0);
return 0;
}