0
点赞
收藏
分享

微信扫一扫

PAT 1053 Path of Equal Weight (30 分) (29分)dfs 回溯?

infgrad 2022-02-04 阅读 22
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int target;
struct Node {
    int w;
    vector<int> child;
};
vector<Node> v;
vector<int> path;
void dfs(int index,int nodeNum,int sum){  //传⼊⼀个nodeNum记录对当前路径来说这是第⼏个结点(这样直接在path[nodeNum]⾥⾯存储当前结点的孩⼦结点的序号)
    //终止条件
    if(sum>target) return;                 //已经不符合路径要求
    if(sum==target){
        if(v[index].child.size()!=0) return;  //孩子结点不空,还未到底部,不符合路径要求
        for(int i=0;i<nodeNum;i++){    //到达底部且符合权重要求,打印路径 
            printf("%d%c",v[path[i]].w,i!=nodeNum-1?' ':'\n');
        }
        return;
    }
    //本级递归要干的事,path中存准备访问的孩子结点,更新访问该孩子时的sum,从孩子结点开始判断是否终止和下一层递归
    for(int i=0;i<v[index].child.size();i++){ 
        int node=v[index].child[i];         //下一个孩子结点序号id
        path[nodeNum]=node;                 //路径保存当前准备访问的结点(inedx的孩子node)的序号
        dfs(node,nodeNum+1,sum+v[node].w);   //递归访问v[index]的孩子node,路径步数为走到v[node]的步数,sum为传入路径走到v[node]的w加和
    } 
}
int cmp(int a,int b){
    return v[a].w>v[b].w;
}

int main(){
    int n,m,node,k;         //N表示树中的节点数,M(<N)表示非叶节点数,node表示结点序号ID,k表示某个结点孩子数
    cin>>n>>m>>target;
    v.resize(n);
    path.resize(n);
    for(int i=0;i<n;i++){
        scanf("%d",&v[i].w);
    }
    for(int i=0;i<m;i++){
        scanf("%d %d",&node,&k);
        v[node].child.resize(k);
        for(int j=0;j<k;j++){
            scanf("%d",&v[node].child[j]);
        }
        sort(v[node].child.begin(),v[node].child.end(),cmp);
    }
    dfs(0,1,v[0].w);
    system("pause");
    return 0;
}
举报

相关推荐

0 条评论