树上任意两点 之间的距离max
作者:
Lemmon_kk
,
2020-07-14 11:09:45
,
所有人可见
,
阅读 1032
表述
树上任意两点 之间的距离max
f[u] 为 向 儿子方向走的最远距离
g[u] 为 向 父亲方向走的最远距离
思路
// 自底向上
f[u] = max{f[v] + w[u][v]}; v = son[u];
// 自上向下
g[u] = max(f[v] + w[p[u][v]], g[p[u]]) + w[p[u]][u]; v = brother[u];
代码
int dfs(int u,int fa){
for(int i = h[u];~i;i = ne[i]){
int j = e[i];
if(j == fa) continue;
dfs(j, u);
f[u] = max(f[u], f[j] + w[i]);
}
return f[u];
}
dfs(1, 0);
void dfs2(int u,int fa,int form){
int t = 0;
g[u] = max(g[u], g[fa]);
for(int i = h[fa];~i;i = ne[i]){
int j = e[i];
if(j == p[fa]) continue;
if(j == u) continue;
g[u] = max(g[u], f[j] + w[i]);
}
if(~from) g[u] += w[from];
for(int i = h[u];~i;i = ne[i]){
int j = e[i];
if(j == fa) continue;
dfs2(j, u, i);
}
}
dfs(1, 0, -1);