解法一:DFS
先将整棵树构建出来,然后用DFS寻找符合条件的路径并保存。将满足条件的路径按照题目要求排序并打印。
#include <bits/stdc++.h>
using namespace std;
class Node {
public:
int weight;
vector<Node *> next;
Node() {
}
};
bool cmp(vector<int> &o1, vector<int> &o2) {
int len = min(o1.size(), o2.size());
for (int i = 0; i < len; ++i) {
if (o1[i] == o2[i]) {
continue;
} else if (o1[i] > o2[i]) {
return true;
} else {
return false;
}
}
}
deque<Node *> nodeList;
vector<vector<int>> ansList;
void dfs(Node &root, int rest) {
if (rest == 0) {
if (nodeList.back()->next.empty()) {
vector<int> vec;
for (auto &it:nodeList) {
vec.emplace_back(it->weight);
}
ansList.emplace_back(vec);
}
return;
} else if (rest < 0) {
return;
}
for (auto &node:root.next) {
nodeList.emplace_back(node);
dfs(*node, rest - node->weight);
nodeList.pop_back();
}
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
int N, M, S;
cin >> N >> M >> S;
map<int, Node> nodeMap;
for (int i = 0; i < N; ++i) {
Node node;
cin >> node.weight;
nodeMap.emplace(i, node);
}
int index, K, tmp;
for (int i = 0; i < M; ++i) {
cin >> index >> K;
Node *cur = &nodeMap.find(index)->second;
for (int j = 0; j < K; ++j) {
cin >> tmp;
cur->next.emplace_back(&nodeMap.find(tmp)->second);
}
}
Node *root = &nodeMap.find(0)->second;
nodeList.emplace_back(root);
dfs(*root, S - root->weight);
sort(ansList.begin(), ansList.end(), cmp);
for (auto &vec:ansList) {
cout << vec.front();
for (int i = 1; i < vec.size(); ++i) {
cout << " " << vec[i];
}
cout << "\n";
}
}