注:比较函数写得有点复杂
#include <stdio.h>
#include <deque>
#include <algorithm>
#include <cmath>
using namespace std;
typedef struct Node {
int key;
int left;
int right;
} Node;
Node tree[101];
int n, m, s;
deque<deque<int> > out;
int cmp(deque<int> a, deque<int> b) {
int size = (a.size() > b.size() ? a.size() : b.size());
int i = 0;
int suma = 0;
int sumb = 0;
i = 0;
while (i < a.size()) {
suma += a[i] * pow(10, size - 1 - i);
i++;
}
i = 0;
while (i < b.size()) {
sumb += b[i] * pow(10, size - 1 - i);
i++;
}
return suma > sumb;
}
void dfs(int id, int lastsum, deque<int> dq);
int main (int argc, char *argv[]) {
scanf("%d %d %d", &n, &m, &s);
int i, j, k;
int in;
for (i = 0; i < 101; i++) {
tree[i].key = tree[i].left = tree[i].right = -1;
}
for (i = 0; i < n; i++) {
scanf("%d", &in);
tree[i].key = in;
}
for (i = 0; i < m; i++) {
scanf("%d %d", &in, &k);
int child;
scanf("%d", &child);
tree[in].left = child;
for (j = 1; j < k; j++) {
scanf("%d", &tree[child].right);
child = tree[child].right;
}
}
deque<int> dq;
dfs(0, 0, dq);
sort(out.begin(), out.end(), cmp);
for (i = 0; i < out.size(); i++) {
for (j = 0; j < out[i].size(); j++) {
printf("%d", out[i][j]);
if (j < out[i].size() - 1) printf(" ");
else printf("\n");
}
}
return 0;
}
void dfs(int id, int lastsum, deque<int> dq) {
if (lastsum + tree[id].key < s) {
dq.push_back(tree[id].key);
lastsum += tree[id].key;
int c = tree[id].left;
while (c != -1) {
dfs(c, lastsum, dq);
c = tree[c].right;
}
} else if (lastsum + tree[id].key == s) {
if (tree[id].left == -1) {
dq.push_back(tree[id].key);
out.push_back(dq);
return;
} else return;
}
return;
}