最后一个测试点容易出现段错误,见代码中注释。
#include<vector>
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn = 10500;
struct node {
int weight;
vector<int> child;
} n[maxn];
int sum = 0;
vector<int> temp;
vector<vector<int> > result;
void find(int root, int S) {
sum += n[root].weight;
temp.push_back(n[root].weight);
if (n[root].child.size() == 0 && sum == S) {
result.push_back(temp);
}
for (int i = 0; i < n[root].child.size(); i++) {
find(n[root].child[i], S);
}
temp.pop_back();
sum -= n[root].weight;
return;
}
bool cmp(vector<int> a, vector<int> b) {
int length = min(a.size(), b.size());
for (int i = 0; i < length; i++) {
if (a[i] > b[i]) return true;
else if (a[i] < b[i]) return false;
}
return a.size() > b.size(); // using ">=" may let the last test point go wrong
}
int main() {
int N, M, S;
scanf("%d %d %d", &N, &M, &S);
for (int i = 0; i < N; i++) {
scanf("%d", &n[i].weight);
}
int id, childNum, child;
for (int i = 0; i < M; i++) {
scanf("%d %d", &id, &childNum);
while (childNum--) {
scanf("%d", &child);
n[id].child.push_back(child);
}
}
find(0, S);
if (result.size() != 0) {
sort(result.begin(), result.end(), cmp);
int i, j;
for (i = 0; i < result.size(); i++) {
for (j = 0; j < result[i].size() - 1; j++) {
printf("%d ", result[i][j]);
}
printf("%d\n", result[i][j]);
}
}
else printf("none\n");
return 0;
}