#include <iostream>
#include <cstdio>
#include <vector>
#include <queue>
#include <stack>
#include <algorithm>
using namespace std;
#define N 100
struct path {
vector<int> *p;
bool operator<(const path & b) const {
bool flag = false;
for(int i = 0; i < p->size() && i < b.p->size(); i ++) {
int w1 = (*p)[i], w2 = (*b.p)[i];
if(w1 != w2) {
flag = (w1 > w2);
break;
}
}
return flag;
}
};
int main(int argc, char **argv) {
int n, m, s;
cin >> n >> m >> s;
int w[N] = {};
int r[N] = {};
vector<int> nlf[N];
for(int i = 0; i < n; i ++)
cin >> w[i];
for(int i = 0; i < m; i ++) {
int id, cn;
cin >> id >> cn;
for(int j = 0; j < cn; j ++) {
int cid;
cin >> cid;
nlf[id].push_back(cid);
r[cid] = id;
}
}
int pw[N] = {};
pw[0] = w[0];
vector<int> qlf;
if(n) {
queue<int> q;
q.push(0);
while(q.size()) {
int node = q.front();
q.pop();
if(pw[node] < s) {
for(int i = 0; i < nlf[node].size(); i ++) {
int c = nlf[node][i];
pw[c] = pw[node] + w[c];
if(pw[c] <= s)
q.push(c);
}
}
else if(pw[node] == s && nlf[node].empty())
qlf.push_back(node);
}
}
stack<int> pws;
vector<path> ps;
for(int i = 0; i < qlf.size(); i ++) {
int node = qlf[i];
path p;
p.p = new vector<int>;
while(node) {
pws.push(node);
node = r[node];
}
pws.push(0);
while(pws.size()) {
p.p->push_back(w[pws.top()]);
pws.pop();
}
ps.push_back(p);
}
sort(ps.begin(), ps.end());
for(int i = 0; i < ps.size(); i ++) {
vector<int> &pp = *(ps[i].p);
cout << pp[0];
for(int j = 1; j < pp.size(); j ++)
cout << ' ' << pp[j];
cout << endl;
}
return 0;
}
1053. Path of Equal Weight (30)
最新推荐文章于 2022-04-13 00:26:50 发布