#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector>
using namespace std;
const int N=1e4+10;
int n,m,sum;
bool g[N][N];
int w[N];
vector< vector<int> >ans;
void dfs(int u,int s,vector<int> &path){//现在查阅到的节点编号(实际也是数量-1),权值之和
bool is_leaf=true;
for(int i=0;i<n;i++){
if(g[u][i]){ is_leaf=false;break;}
}
if(is_leaf){
if(s==sum) ans.push_back(path);
}else{
for(int i=0;i<n;i++){
if(g[u][i]){
path.push_back(w[i]);
dfs(i,s+w[i],path);
path.pop_back();
}
}
}
}
int main(){
cin>>n>>m>>sum;
for(int i=0;i<n;i++) cin>>w[i];
for(int i=0;i<m;i++){
int id,k;cin>>id>>k;
for(int i=0;i<k;i++){
int son;cin>>son;
g[id][son]=true;
}
}
vector<int> path({w[0]});
dfs(0,w[0],path);
sort(ans.begin(),ans.end(),greater<vector<int>>());
for(auto p:ans){
int cnt=p.size();
cout<<p[0];
for(int i=1;i<cnt;i++) cout<<' '<<p[i];
cout<<endl;
}
return 0;
}
1053 Path of Equal Weight 分数 30
最新推荐文章于 2024-08-21 18:53:45 发布