1053 Path of Equal Weight (30 分)

1053 Path of Equal Weight (30 分)

题目大意

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

基本思路

数据结构:
定义二维数组v,下标是结点编号,值是这个结点所有孩子结点的结点编号。
定义数组value,下标是结点编号,值是这个结点的权重
定义数组pathweight存放从根结点到叶子结点的临时路径上的每个结点的权值
基本思路:
读入每个结点的权值。
读入每个非叶子结点的所有孩子结点,每读完一组测试用例,需要把这个结点的所有孩子结点的按照权值的大小从大到小排序(这一步可以保证最终的路径是按照从大到小给出的)。
从根结点编号0开始dfs深搜,求出每一条符合条件的路径。

代码

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

int n,m,sum;
vector<int> v[105];//下标是结点编号,值是这个结点所有孩子结点的结点编号
int value[105];//下标是结点编号,值是这个结点的权重
dfs深搜求有没有路径权重为num的路径
vector<int> pathweight;//存放临时路径上的所有结点的权值
void dfs(int root){//形参为当前树的结点编号
    //递归边界
    if(v[root].size()==0){
        pathweight.push_back(value[root]);
        int tempsum=0;
        for(int i=0;i<pathweight.size();i++){
            tempsum+=pathweight[i];
        }
        if(tempsum==sum){
            cout<<pathweight[0];
            for(int i=1;i<pathweight.size();i++) cout<<" "<<pathweight[i];
            cout<<endl;
        }
        pathweight.pop_back();
        return;
    }
    pathweight.push_back(value[root]);
    for(int i=0;i<v[root].size();i++){
        dfs(v[root][i]);
    }
    pathweight.pop_back();
}
//每一个结点(结点编号)的所有孩子结点(结点编号)按照它的value[结点编号]的大小逆序排序
 bool cmp1(int a,int b){
     return value[a]>value[b];
 }

int main(){
    cin>>n>>m>>sum;
    //读入每个结点的权值
    for(int i=0;i<n;i++) cin>>value[i];
    //读入每个非叶子结点的孩子结点
    int ans,k,tempans;
    for(int i=0;i<m;i++){
        cin>>ans>>k;
        while(k--){
            cin>>tempans;
            v[ans].push_back(tempans);
        }
        sort(v[ans].begin(),v[ans].end(),cmp1);
    }
    //dfs深搜求有没有路径权重为num的路径
    dfs(0);//从根结点编号00开始深搜
    return 0;
}
上一篇:windows服务安装启动报错误1053:服务没有及时响应启动或控制请求(示例代码)


下一篇:【PAT乙级】1053 住房空置率 (20 分)