洛谷 P14919:[GESP202512 六级] 路径覆盖 ← DFS + 树形DP

【题目来源】
https://www.luogu.com.cn/problem/P14919
https://oj.czos.cn/p/5939

【题目描述】
给定一棵有 n 结点的有根树 T,结点依次以 1,2,…,n 编号,根结点编号为 1。方便起见,编号为 i 的结点称为结点 i。
初始时 T 中的结点均为白色。你需要将 T 中的若干个结点染为黑色,使得所有叶子到根的路径上至少有一个黑色结点。将结点 i 染为黑色需要代价 ci,你需要在满足以上条件的情况下,最小化染色代价之和。
叶子是指 T 中没有子结点的结点。

【输入格式】
第一行,一个正整数 n,表示结点数量。
第二行,n-1 个正整数 f2,f3,…,fn,其中 fi表示结点i的父结点的编号,保证 fi<i。
第三行,n 个正整数 c1,c2,…,cn,其中 ci 表示将结点 i 染为黑色所需的代价。

【输出格式】
一行,一个整数,表示在满足所有叶子到根的路径上至少有一个黑色结点的前提下,染色代价之和的最小值。

【输入样例一】
4
1 2 3
5 6 2 3

【输出样例一】
2

【输入样例二】
7
1 1 2 2 3 3
64 16 15 4 3 2 1

【输出样例二】
10

【数据范围】
对于 40% 的测试点,保证 2≤n≤16。
对于另外 20% 的测试点,保证 fi=i-1。
对于所有测试点,保证 2≤n≤10^5,1≤ci≤10^9。

【算法分析】
● 动态规划的状态定义:f[i] 表示以节点 i 为根的子树满足“所有叶子到 i 的路径至少有一个黑色结点”的最小染色代价。

● 遍历方式:由于题目中父结点编号一定小于子结点编号(fi < i),因此从 n 到 1 逆序遍历,等价于从叶子结点到根结点的后序遍历(Postorder Traversal),能保证处理父结点时所有子结点已处理完毕。

● 状态转移逻辑
若 i 是叶子结点(无任何子结点),必须将 i 染黑,此时 f[i]=c[i]。这是因为叶子结点无子结点,无法通过子结点覆盖自身。所以,必须直接染黑叶子结点以满足覆盖要求。
若 i 是非叶子结点:有两种选择。
(1)选择自己染黑:代价为 c[i];
(2)选择子节点的覆盖代价之和:代价为所有子结点 f 值的总和;
取两种选择的最小值作为 f[i]。
这种设计,能够确保所有叶子到根的路径上至少有一个黑色结点。
最终答案:根结点 1 的 f[1] 即为整棵树的最小覆盖代价。

【算法代码】
这段代码通过树形 DP 求解树上最小覆盖代价,采用后序 DFS 遍历实现:以 f[u] 表示以结点 u 为根的子树完全覆盖的最小花费,递归处理每个结点的所有子结点并累加子树最优解得到总和,随后对每个结点做出两种最优决策 ——直接将自身染色覆盖整棵子树,或不染色、依赖所有子结点的子树自行覆盖,取两种方案的最小花费更新 f[u],最终根结点的 f[1] 即为整棵树的最小覆盖总代价。

#include <bits/stdc++.h>
using namespace std;

typedef long long LL;
const int N=1e5+5;
vector<int> G[N];
LL c[N]; //c[i] stores cost of coloring node i black
LL f[N]; //f[i]:minimum covering cost of subtree rooted at node i
int n;

void dfs(int u) {
    f[u]=c[u];
    if(G[u].empty()) return;

    LL sum=0;
    for(int v:G[u]) {
        dfs(v);
        sum+=f[v];
    }
    f[u]=min(f[u],sum);
}

int main() {
    cin>>n;
    for(int i=2; i<=n; i++) {
        int fa;
        cin>>fa;
        G[fa].push_back(i);
    }
    for(int i=1; i<=n; i++) {
        cin>>c[i];
    }
    dfs(1);
    cout<<f[1]<<endl;

    return 0;
}

/*
in:
7
1 1 2 2 3 3
64 16 15 4 3 2 1

out:
10
*/





【参考文献】
https://blog.csdn.net/hnjzsyjyj/article/details/156843660
https://www.luogu.com.cn/problem/solution/P14919
 

​

posted @ 2026-04-18 13:37  Triwa  阅读(58)  评论(0)    收藏  举报