0
点赞
收藏
分享

微信扫一扫

【PAT】1053 Path of Equal Weight (30 分)

若如初梘 2022-01-31 阅读 27
算法

dfs遍历树,求路径中结点的权重和,

最后按照路径权重排序输出 

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

int s;
struct node
{
    int w;
    vector<int> children;
}T[100];

vector<vector<int> > path;
void dfs(int root,int this_w,vector<int> &each_path){//放在参数中,每次dfs()后不用恢复值
    if(this_w>s) return;
    if(T[root].children.size()==0 && this_w==s){
            path.push_back(each_path);
            return;
    }

    for(int i=0;i<T[root].children.size();i++){
        int this_node=T[root].children[i];
        each_path.push_back(T[this_node].w);//从nodeNum=0开始的
        dfs(this_node,this_w+T[this_node].w,each_path);
        each_path.pop_back();
    }
}


int main(){
    int n,m;
    scanf("%d %d %d",&n,&m,&s);
    for(int i=0;i<n;i++)  scanf("%d",&T[i].w);

    int tmp_id,k,tmp_child;
    for(int i=0;i<m;i++){
        scanf("%02d %d",&tmp_id,&k);
        while(k--){
            scanf("%02d",&tmp_child);
            T[tmp_id].children.push_back(tmp_child);
        }
    }
    
    vector<int> each_path;
    each_path.push_back(T[0].w);
    dfs(0,T[0].w,each_path);

//注意必须二级排序,否则后面结点的weight会影响当前path的weight
    sort(path.begin(),path.end(),greater<vector<int> >());

    for(int i=0;i<path.size();i++){
        for(int j=0;j<path[i].size();j++){
            printf("%d%s",path[i][j],j==(path[i].size()-1)?"":" ");
        }
        printf("\n");
    }

    return 0;
}

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

int s;
struct node
{
    int w;
    vector<int> children;
}T[100];

vector<int> path;
int this_w=0,nodeNum=-1;
void dfs(int root){
    if(this_w>s) return;
    if(T[root].children.size()==0){
        this_w+=T[root].w,nodeNum+=1;
        if(this_w==s){
            //path.push_back(T[root].w);后面必须clear()
            path[nodeNum]=T[root].w;
            int flag_path=0;
            for(int i=0;i<=nodeNum;i++){
                printf("%s%d",flag_path==1?" ":"",path[i]);
                flag_path=1;
            }
            printf("\n");
        }
        this_w-=T[root].w,nodeNum-=1;
        return;
    }

    for(int i=0;i<T[root].children.size();i++){
        this_w+=T[root].w,nodeNum+=1;
        //path.push_back(T[root].w);后面必须pop_back
        path[nodeNum]=T[root].w;//从nodeNum=0开始的
        dfs(T[root].children[i]);
        this_w-=T[root].w,nodeNum-=1;
    }
}

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


int main(){
    int n,m;
    scanf("%d %d %d",&n,&m,&s);
    path.resize(n+1);
    for(int i=0;i<n;i++)  scanf("%d",&T[i].w);

    int tmp_id,k,tmp_child;
    for(int i=0;i<m;i++){
        scanf("%02d %d",&tmp_id,&k);
        while(k--){
            scanf("%02d",&tmp_child);
            T[tmp_id].children.push_back(tmp_child);
        }
//只能保证一级权重【最后一个点过不了】,必须要二级排序
        sort(T[tmp_id].children.begin(),T[tmp_id].children.end(),cmp1);
    }

    dfs(0);
    return 0;
}
举报

相关推荐

0 条评论