PAT A1053 Path of Equal Weight [树的DFS遍历]

本文介绍了一种在给定树结构中寻找从根节点到叶子节点路径上权值之和等于特定目标数的算法。通过静态数组构建树结构,利用深度优先搜索(DFS)遍历树,找到符合条件的所有路径并按权值大小排序输出。

题目描述

链接
给出树的结构和权值,找从根结点到叶子结点的路径上的权值相加之和等于给定目标数的路径,并且从大到小输出路径

分析

  • 静态数组建树
  • dfs遍历:注意什么地方要回溯状态
  • 二维数组排序,基本用vector实现,记住以后写begin和end了!如果用vector的话
bool cmp(vector<int> a, vector<int> b){
    int len = min(a.size(),b.size());
    for(int i=0;i<len;i++){
        if(a[i] == b[i]) continue
    }
}
sort(ans.begin(), ans.end(), cmp);
  • 当然最后这里还是用了一维数组排序,因为有个点过不了,很奇怪
#include<bits/stdc++.h>
using namespace std;

const int maxn = 105;
struct node{
    int w;
    vector<int> child;
}nodes[maxn];

bool cmp(int a, int b){
    return nodes[a].w > nodes[b].w;
}

int n,m,s,k,id;

int sum;
vector<vector<int> > ans;
vector<int> path;
void dfs(int i){
    path.push_back(nodes[i].w);
    sum += nodes[i].w;
    if(nodes[i].child.size()==0){
        if(sum == s){
            ans.push_back(path);
        }
        path.pop_back();
        sum -= nodes[i].w;
        return;
    }
    for(int j=0;j<nodes[i].child.size();j++){
        dfs(nodes[i].child[j]);
    }
    path.pop_back();
    sum -= nodes[i].w;
}


int main(){
    cin>>n>>m>>s;
    for(int i=0;i<n;i++){
        cin>>nodes[i].w;
    }
    for(int i=0;i<m;i++){
        cin>>id>>k;
        for(int j=0;j<k;j++){
            int tmp;
            cin>>tmp;
            nodes[id].child.push_back(tmp);
        }
        sort(nodes[id].child.begin(), nodes[id].child.end(), cmp);
    }
    dfs(0);
    for(int i=0;i<ans.size();i++){
        for(int j=0;j<ans[i].size();j++){
            if(j==0) cout<<ans[i][j];
            else cout<<" "<<ans[i][j];
        }
        cout<<endl;
    }

}

转载于:https://www.cnblogs.com/doragd/p/11269755.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值