POJ

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);
}
原文地址:https://www.cnblogs.com/hznumqf/p/13538459.html