//之前一直尝试用vector存储path,但是每次错误后回退上一级节点时不能争取回退,导致探索路径正确,但是输出不正确,用参数num,标记前一个路径点的位置传递参数,就好多了
//其中在输入时就将后继节点按照权值大小排列,是可以学习方法,再输入时就处理好,方便dfs探索,有几道PAT题目都是在该基础上对路径加要求,都可以直接改进输出那一部分代码,更新更和要求的路径,全部遍历完,就可得到所求符合要求的的路径
//参数传递的思想也不错,之前不习惯,总是直接把ans存进vector,最后输出
#include<cstdio> #include<queue> #include<vector> #include<algorithm> using namespace std; const int maxn=101; const double INF=1<<30; struct node { int total; int weight; vector<int>child; }; node list[maxn]; queue<int >q; int path[maxn]; int n,m,s; bool cmp(int a,int b) { return list[a].weight>list[b].weight; } void dfs(int v,int num) { if(list[v].total>s)return; if(list[v].total==s) { if(list[v].child.size()!=0)return ; for(int j=0;j<num;j++) { if(j==num-1)printf("%d\n",list[path[j]].weight); else printf("%d ",list[path[j]].weight); } } for(int i=0;i<list[v].child.size();i++) { int t=list[v].child[i]; list[t].total+=list[v].total; path[num]=t; dfs(t,num+1); } } int main() { freopen("input.txt","r",stdin); int i,j,k,id,tmp; while(scanf("%d%d%d",&n,&m,&s)!=EOF) { for(i=0;i<n;i++) { scanf("%d",&list[i].weight); list[i].total=list[i].weight; } for(i=0;i<m;i++) { scanf("%d%d",&id,&k); for(j=0;j<k;j++) { scanf("%d",&tmp); list[id].child.push_back(tmp); } sort(list[id].child.begin(),list[id].child.end(),cmp); } dfs(0,1); } return 0; }