解法一:DFS

先将整棵树构建出来,然后用DFS寻找符合条件的路径并保存。将满足条件的路径按照题目要求排序并打印。

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. class Node {
  4. public:
  5. int weight;
  6. vector<Node *> next;
  7. Node() {
  8. }
  9. };
  10. bool cmp(vector<int> &o1, vector<int> &o2) {
  11. int len = min(o1.size(), o2.size());
  12. for (int i = 0; i < len; ++i) {
  13. if (o1[i] == o2[i]) {
  14. continue;
  15. } else if (o1[i] > o2[i]) {
  16. return true;
  17. } else {
  18. return false;
  19. }
  20. }
  21. }
  22. deque<Node *> nodeList;
  23. vector<vector<int>> ansList;
  24. void dfs(Node &root, int rest) {
  25. if (rest == 0) {
  26. if (nodeList.back()->next.empty()) {
  27. vector<int> vec;
  28. for (auto &it:nodeList) {
  29. vec.emplace_back(it->weight);
  30. }
  31. ansList.emplace_back(vec);
  32. }
  33. return;
  34. } else if (rest < 0) {
  35. return;
  36. }
  37. for (auto &node:root.next) {
  38. nodeList.emplace_back(node);
  39. dfs(*node, rest - node->weight);
  40. nodeList.pop_back();
  41. }
  42. }
  43. int main() {
  44. ios::sync_with_stdio(false);
  45. cin.tie(0);
  46. int N, M, S;
  47. cin >> N >> M >> S;
  48. map<int, Node> nodeMap;
  49. for (int i = 0; i < N; ++i) {
  50. Node node;
  51. cin >> node.weight;
  52. nodeMap.emplace(i, node);
  53. }
  54. int index, K, tmp;
  55. for (int i = 0; i < M; ++i) {
  56. cin >> index >> K;
  57. Node *cur = &nodeMap.find(index)->second;
  58. for (int j = 0; j < K; ++j) {
  59. cin >> tmp;
  60. cur->next.emplace_back(&nodeMap.find(tmp)->second);
  61. }
  62. }
  63. Node *root = &nodeMap.find(0)->second;
  64. nodeList.emplace_back(root);
  65. dfs(*root, S - root->weight);
  66. sort(ansList.begin(), ansList.end(), cmp);
  67. for (auto &vec:ansList) {
  68. cout << vec.front();
  69. for (int i = 1; i < vec.size(); ++i) {
  70. cout << " " << vec[i];
  71. }
  72. cout << "\n";
  73. }
  74. }