首页 > 其他 > 详细

POJ - 1985 Cow Marathon 【模板】 树的直径 树形DP 邻接表实现

时间:2020-08-20 23:48:42      阅读:96      评论:0      收藏:0      [点我收藏+]

POJ - 1985 Cow Marathon 【模板】 树的直径 树形DP 邻接表实现

树的直径

图中所有最短路径的最大值即为「直径」,可以用两次 DFS 或者树形 DP 的方法在 O(n) 时间求出树的直径。

做法2 树形DP

我们记录每个节点向下,所能延申的最远距离\(d_1\) 和次远距离\(d_2\) ,那么直径就是所有$d_1 + d_2 $ 的最大值

POJ - 1985

给一颗带权树,询问该树的直径,注意这里dp数组可以滚动。

struct Edge {
    int to;
    ll val;
    Edge(int _to, ll _val) {
        to = _to;
        val = _val;
    }
};

vector<Edge> e[maxn];
ll d;


ll dfs(int u = 1,int p = -1) {
    ll d1 = 0, d2= 0;
    for (auto v : e[u]) {
        if (v.to == p) continue;
        ll d = dfs(v.to, u) + v.val;
        if (d > d1) d2 = d1, d1 = d;
        else if (d > d2) d2 = d;
    }
    d = max(d, d1 + d2);
    return d1;
}


int main() {
    int n = readint();
    int m = readint();
    char s[5];
    for (int i = 0; i < m; i++) {
        int x = readint();
        int y = readint();
        ll z = readll();
        scanf("%s", s);
        e[x].push_back(Edge(y,z));
        e[y].push_back(Edge(x,z));
    }
    dfs();
    Put(d);
}

POJ - 1985 Cow Marathon 【模板】 树的直径 树形DP 邻接表实现

原文:https://www.cnblogs.com/hznumqf/p/13538459.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!