树的中心——树形dp

树的中心

思路:
个人感觉有点像dfs的复习
一个点的最长距离分为向下走的最长和向上走的最长,然后先求向下,向下要先求子节点,自下而上;求向上的时候要判断子节点是不是在向下的最长路径中,如果在的话,那么选择第二长的和向上的,如果不在的话那么就选择向下最长的和向上的
代码:

#include <iostream>
#include <vector>
using namespace std;
const int N = 1e4+10;
typedef pair<int,int> PII;

vector<PII> v[N];
int d1[N],d2[N];
int up[N],p[N];

int dfs(int u,int father){
    for(auto i:v[u]){
        int b = i.first;
        int w = i.second;
        if(b== father) continue;
        int d = dfs(b,u)+w;
        if(d>d1[u]) d2[u]  = d1[u],d1[u] =d,p[u] = b;
        else if(d>d2[u]) d2[u] = d;
    }

    return d1[u];
}

void dfs_u(int u,int father){
    for(auto i:v[u]){
        int b = i.first;
        int w = i.second;
        if(b == father) continue;
        if(p[u]==b) up[b] = max(d2[u],up[u])+w;
        else up[b] = max(up[u],d1[u])+w;
        dfs_u(b,u);
    }
}


int main() {

    int n,m;
    cin>>n;
    m = n;
    n--;
    while(n--){
        int a,b,c;
        scanf("%d%d%d",&a,&b,&c);
        v[a].push_back({b,c});
        v[b].push_back({a,c});
    }
    dfs(1,-1);
    dfs_u(1,-1);
    int maxx = 0x3f3f3f3f;
    for(int i = 1;i<=m;i++){
        maxx = min(maxx,max(d1[i],up[i]));
    }
    cout<<maxx;
    return 0;
}

### Python 中树形动态规划(Tree DP)的实现方法 #### 基本概念 树形动态规划是一种基于结构的动态规划技术,其核心在于通过递归的方式分解子问题并逐步构建解决方案。在树形DP中,通常会以节点为单位进行状态转移,最终汇总到根节点得出全局最优解。 #### 经典例题分析 以下是几个经典的树形DP问题及其对应的Python实现: --- #### 1. **二叉的最大路径和** 该问题是典型的树形DP应用场景之一,目标是在一棵二叉中找到一条路径使得路径上的节点值之和最大[^2]。 ##### 解决方案 可以通过自底向上的方式计算每棵子的最大贡献值,并将其传递给父节点。 ```python class TreeNode: def __init__(self, val=0, left=None, right=None): self.val = val self.left = left self.right = right def maxPathSum(root: TreeNode) -> int: res = float('-inf') # 记录全局最大路径和 def dfs(node): nonlocal res if not node: return 0 # 只有当子的贡献大于零时才考虑加入当前路径 left_gain = max(dfs(node.left), 0) right_gain = max(dfs(node.right), 0) # 当前节点作为路径最高点的情况下的总收益 current_max_path = node.val + left_gain + right_gain res = max(res, current_max_path) # 返回当前节点对其父节点的最大贡献 return node.val + max(left_gain, right_gain) dfs(root) return res ``` 上述代码实现了对任意二叉寻找最大路径和的功能,其中`dfs`函数负责递归遍历整个结构,并更新全局变量`res`来记录最大路径和。 --- #### 2. **相邻字符不同的最长路径** 此问题要求在一棵上找出满足特定条件的最长路径长度,即路径上的所有字符均不相同。 ##### 解决方案 可以采用DFS结合回溯的方法,在每次访问新节点时维护当前路径的状态集合。 ```python from collections import defaultdict def longestPath(parents, s): tree = defaultdict(list) for i in range(1, len(parents)): tree[parents[i]].append(i) result = 0 def dfs(node): nonlocal result first_longest, second_longest = 0, 0 char = s[node] for child in tree[node]: path_length = dfs(child) if s[child] != char: if path_length > first_longest: second_longest = first_longest first_longest = path_length elif path_length > second_longest: second_longest = path_length result = max(result, first_longest + second_longest + 1) return first_longest + 1 dfs(0) return result ``` 这段代码展示了如何处理带权图中的最优化问题,同时兼顾了约束条件——路径上的字符互异。 --- #### 提升的应用对比 虽然提升主要用于回归和分类任务,但它也体现了类似的分层决策机制。下面是一个简单的提升回归模型示例[^3]: ```python import numpy as np class BoostingTree: def __init__(self, FX=[]): self.FX = FX def Regress(self, test_samples): """ 提升的回归函数 """ base_tree = lambda x, v, f1, f2: (x < v and [f1] or [f2])[0] reg_efunc = lambda x: sum([base_tree(x, v, f1, f2) for v, f1, f2 in self.FX]) reg_func = np.frompyfunc(reg_efunc, 1, 1) return reg_func(test_samples) ``` 尽管此处展示的是完全不同的领域背景,但两者都依赖于层次化的数据拆分策略。 --- ### 总结 以上介绍了几种常见的树形动态规划实例以及其实现细节。这些例子涵盖了从基本操作到复杂逻辑的不同层面,能够帮助理解树形DP的本质特性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值