1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75
| #include <cstdio> #include <vector> #include <algorithm> using namespace std; const int maxn=110; struct Node{ int data; vector<int> child; }nodes[maxn]; int n,m,s; vector<int> vec; vector<vector<int> > ans; vector<vector<int> > res;
void dfs(int index){ vec.push_back(index); int len=nodes[index].child.size(); if (len==0){ ans.push_back(vec); } for(int i=0;i<len;i++){ dfs(nodes[index].child[i]); } vec.pop_back(); }
bool cmp(vector<int>& a,vector<int>& b){ int len=min(a.size(),b.size()); for(int i=0;i<len;i++){ if (a[i]!=b[i]) return a[i]>b[i]; } return a.size()>b.size(); }
int main(){ scanf("%d%d%d",&n,&m,&s); for(int i=0;i<n;i++){ scanf("%d",&nodes[i].data); } for(int i=0;i<m;i++){ int id,k,x; scanf("%d%d",&id,&k); for(int j=0;j<k;j++){ scanf("%d",&x); nodes[id].child.push_back(x); } } dfs(0); for (int i = 0; i < ans.size();i++) { int sum=0; for (int j = 0; j<ans[i].size();j++) { sum+=nodes[ans[i][j]].data; } vec.clear(); if (sum==s){ for(int j=0;j<ans[i].size();j++){ vec.push_back(nodes[ans[i][j]].data); } res.push_back(vec); } } sort(res.begin(),res.end(),cmp); for(int i=0;i<res.size();i++){ for(int j=0;j<res[i].size();j++){ if (j!=0) printf(" "); printf("%d",res[i][j]); } if (i!=res.size()-1) printf("\n"); } return 0; }
|