PAT1053 Path of Equal Weight(DFS路径)

传送门

给定一棵带权树,求根节点到叶节点等于给定数的带权路径,降序输出。

考虑在输入的时候进行降序排序

渣渣如我已经忘了dfs怎么用回溯存路径了。。

#include <iostream>
#include<bits/stdc++.h>
#define rep(i,a,n) for(int i=a;i<n;i++)
#define sca(x) scanf("%d",&x)
#define sca2(x,y) scanf("%d%d",&x,&y)
#define scl(x) scanf("%lld",&x)
#define pri(x) printf("%d\n",x)
#define pri2(x,y) printf("%d %d\n",x,y)
#define prs(x) printf("%s\n",(x))
#define prl(x) printf("%lld\n",x)
#define ll long long
#define PII pair<int,int>
#define eps 1e-6
#define inf 1e17
#define INF 0x3f3f3f3f
using namespace std;
const int maxn=1e3+5;
struct node{
    int son[maxn];
    int sz;
}tree[maxn];
int a[maxn];
int n,m,sum;
int id,s,t;
vector<int> ans;
void dfs(int root,int tot){
    if(tot>sum) {
        return;
    }
    if(tree[root].sz==0){
        if(tot==sum){
            for(int i=0;i<ans.size();i++){
                printf("%d%c",ans[i],i==ans.size()-1?'\n':' ');
            }
        }
        return ;
    }
    rep(i,0,tree[root].sz){
        int nxt=tree[root].son[i];
        ans.push_back(a[nxt]);
        dfs(nxt,tot+a[nxt]);
        ans.pop_back();
    }
}
bool cmp(int x,int y){
    return a[x]>a[y];
}
int main(){
    cin>>n>>m>>sum;
    rep(i,0,n)sca(a[i]);
    while(m--){
        cin>>id>>t;
        tree[id].sz=t;
        rep(i,0,t){
            cin>>s;
            tree[id].son[i]=s;
        }
        sort(tree[id].son,tree[id].son+tree[id].sz,cmp);
    }
    ans.push_back(a[0]);
    dfs(0,a[0]);
}
发布了88 篇原创文章 · 获赞 6 · 访问量 7901

猜你喜欢

转载自blog.csdn.net/kl782636177/article/details/105149379
今日推荐