「模板」树的直径
树形DP
求出每个子树的最长链,与父亲当前的最长链加起来更新直径,然后更新父亲最长链。
int f[N],mx;
void dfs(int u,int fa)
{
for(int i = head[u]; i; i = e[i].nxt)
{
int v = e[i].v;
if(v == fa) continue;
dfs(v,u);
mx = max(mx,f[u] + f[v] + e[i].w);
f[u] = max(f[u],f[v] + e[i].w);
}
}
两遍DFS
先以任意节点为根,dfs找出最远的点,再以这个点为根 dfs 找出最远的点,这两个点即为直径的连个端点。
void dfs(int u,int fa)
{
for(int i = head[u]; i; i = e[i].nxt)
{
int v = e[i].v;
if(v == fa) continue;
dep[v] = dep[u] + e[i].w;
if(mx < dep[v]) mx = dep[v], pos = v;
dfs(v,u);
}
}
$$A\ drop\ of\ tear\ blurs\ memories\ of\ the\ past.$$