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);
}