古典叙事 · 技术札记

序章

山河有卷
人间有声

写代码,也写长风、旧城与未熄的灯。
愿每一篇随笔,都有自己的山水与回声。
阅览随笔

树的直径

树的直径

直径就是树上两个节点中的最长距离

解法

跑两次dfs,先求出距离x最远的点y,再对y跑一次dfs计算最远距离

解法2dp维护最大与次大

long long diameter = 0;

long long dfs(int u, int parent) {
    long long mx1 = 0;
    long long mx2 = 0;

    for (auto [v, weight] : tree[u]) {
        if (v == parent) {
            continue;
        }

        long long candidate = dfs(v, u) + weight;

        if (candidate > mx1) {
            mx2 = mx1;
            mx1 = candidate;
        } else if (candidate > mx2) {
            mx2 = candidate;
        }
    }

    // 经过 u 的最长路径
    diameter = max(diameter, mx1 + mx2);

    // 返回 u 向下的最长链
    return mx1;
}
posted @ 2026-08-18 19:48  Morphis‘  阅读(6)  评论(0)    收藏  举报