1053 Path of Equal Weight (30分) PAT

最后一个测试点容易出现段错误,见代码中注释。

#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;
}
发布了17 篇原创文章 · 获赞 0 · 访问量 2443

猜你喜欢

转载自blog.csdn.net/Ike_Lin/article/details/104501671