【树形DP】POJ.1985 Cow Marathon
2022-03-31 20:38:00
# ACM
题链
https://vjudge.net/problem/POJ-1985
题解
- 求树的直径,边权都为正,输出直径的值
- 假设树以 1 为根
- 以 u 为根,最长直径要么是经过 u 节点的,要么是在 u 节点的某个子树底下
- 设 dp[u] 表示 u 的子树从 u 开始往下走到某个叶子最远能走多远
- dp[u] = max(dp[vi] + dis(u, v));
- 对于 节点 u :
- ans = max( ans, dp[vi] + dp[vj] + dis(u, vi) + dis(u, vj) );
- vi 和 vj 是 u 的某两个不同的孩子节点
- 于是可以先 dfs 到底,dp[u] + dp[v] + dis(u, v) 的方式更新 ans
- 因为 dp[u] 是遍历到 v 孩子之前更新到的最长链路了
代码
1 |
|