[PAT解题报告] Path of Equal Weight

给定一棵树,每个节点有一个值,找到从根到叶子,所有和为给定值的路径。

其实题目不难。因为路径规定比较死,从根到叶子,所以路径树最多等于叶子树。我们遍历整个树,例如dfs,到达叶子时,我们有了这条路径本身,以及这条路径的权值和,如果和满足要求,我们就保留它,最后输出注意按字典序排序……
所以本质就是一个dfs。

代码:

#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;

int a[102],w;
vector<int> con[102];
bool mark[102];

void dfs(int now,int sum, vector<int> &path, vector<vector<int> > &answer) {
    path.push_back(a[now]);
    sum += a[now];
    if (con[now].empty()) {
        if (sum == w) {
            answer.push_back(path);
        }
    
    }
    else {
        for (int i = 0; i < con[now].size(); ++i) {
            dfs(con[now][i], sum, path, answer);
        }
    }
    path.pop_back();
}
    
int main() {
int n, m;
    scanf("%d%d%d",&n,&m,&w);
    for (int i = 0; i < n; ++i) {
        scanf("%d",a + i);
    }
    for (;m;--m) {
        int x,y;
        for (scanf("%d%d",&x,&y);y;--y) {
            int z;
            scanf("%d",&z);
            con[x].push_back(z);
            mark[z] = true;
        }
    }
    for (m = 0; mark[m]; ++m) 
    ;
    vector<int> path;
    vector<vector<int> > answer;
    dfs(m, 0, path, answer);
    sort(answer.begin(),answer.end());
    for (int i = answer.size() - 1; i >= 0; --i) {
        for (int j = 0; j < answer[i].size(); ++j) {
            if (j) {
                putchar(' ');
            }
            printf("%d",answer[i][j]);
        }
        puts("");
    }
    return 0;
}


原题链接: http://www.patest.cn/contests/pat-a-practise/1053
全部评论

相关推荐

03-29 12:10
门头沟学院 C++
挣K存W养DOG:散漫消极者淘汰,一眼坑爹。实习几个月转正的时候说你加班太少,能力还行态度不够积极裁了,马上老实。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务