解法一: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";}}
