注意:
1.对于树的存储和二叉树类似,不同之处在与存储其孩子时用vector
struct no{
int data;
int wei;
//用vector表示其孩子
vector <int> next;
}node[MAX];
2.要求按照权值的从大到小输出
方法1:用set记录所有路径,倒着进行输出
但该方法不可行,虽然set可以排序,但是set有去重复功能,虽然路径不同,但是可能权值相同
方法2:记录树的孩子时,就按照权值从大到小排序,这样dfs时,就会先dfs大,先记录权值大的路径,后面就无需排序了
给容器排序,也用algorithm中的sort,可以自定义cmp,只有vector,string,deque可以排序,map和set不能排序,因为其本身利用红黑树实现
bool cmp(int x,int y){
return node[x].wei>node[y].wei;
}
vector <int> tmp;
while(k--){
int x;
scanf("%d",&x);
tmp.push_back(x);
}
sort(tmp.begin(),tmp.end(),cmp);
3.找到符合权值的路径,并打印出来
方法与求最短路径中的dij+dfs中的dfs类似,要递归进行,且记录该路径,即用vector记录tmppath,不断弹入弹出
要注意,这里ans记录权值,也要随着元素弹入弹出进行变化
由于选路时已经按序查找了,因此找到符合路径直接输出即可
vector <int> tmppath;
void dfs(int x){
if(node[x].next.size()==0){
tmppath.push_back(x);
ans+=node[x].wei;
if(ans==k){
for(int i=0;i<tmppath.size();i++){
int kk=tmppath[i];
if(i+1==tmppath.size()){
printf("%d\n",node[kk].wei);
}else{
printf("%d ",node[kk].wei);
}
}
}
tmppath.pop_back();
ans-=node[x].wei;
return ;
}
tmppath.push_back(x);
ans+=node[x].wei;
for(int i=0;i<node[x].next.size();i++){
dfs(node[x].next[i]);
}
ans-=node[x].wei;
tmppath.pop_back();
}
#include <cstdio>
#include <vector>
#include<algorithm>
using namespace std;
#define MAX 110
//树的存储结构
struct no{
int wei;
//用vector表示其孩子
vector <int> next;
}node[MAX];
int inq[MAX];
int n,non,k;
bool cmp(int x,int y){
return node[x].wei>node[y].wei;
}
vector <int>tmppath;
int ans=0;
//vector <vector <int> > path;
void dfs(int x){
if(node[x].next.size()==0){
tmppath.push_back(x);
ans+=node[x].wei;
if(ans==k){
//vector <int> dis;
for(int i=0;i<tmppath.size();i++){
int kk=tmppath[i];
//dis.push_back(node[kk].wei);
if(i+1==tmppath.size()){
printf("%d\n",node[kk].wei);
}else{
printf("%d ",node[kk].wei);
}
}
//path.push_back(dis);
}
tmppath.pop_back();
ans-=node[x].wei;
return ;
}
tmppath.push_back(x);
ans+=node[x].wei;
for(int i=0;i<node[x].next.size();i++){
dfs(node[x].next[i]);
}
ans-=node[x].wei;
tmppath.pop_back();
}
int main(){
freopen("in.txt","r",stdin);
scanf("%d %d %d",&n,&non,&k);
for(int i=0;i<n;i++){
scanf("%d",&node[i].wei);
}
for(int i=0;i<non;i++){
int no,k;
scanf("%d %d",&no,&k);
vector <int> tmp;
while(k--){
int x;
scanf("%d",&x);
tmp.push_back(x);
}
sort(tmp.begin(),tmp.end(),cmp);
node[no].next=tmp;
}
dfs(0);
return 0;
}