「模板」树的直径

树形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);
    }
}
posted @ 2021-07-21 22:36  Acestar  阅读(61)  评论(0编辑  收藏  举报