[[TOC]]

树的直径

定义

定义: 什么是树的直径: 树上面的最长的一条路径 , 被称为树的直径. 也叫树的最长路径,最远点对.

两次dfs求直径

题目地址: poj 1985 Cow Marathon

模板

//TLP:tree_longest_path
namespace TLP {
    using namespace xlx1;
    typedef long long ll;
    ll node,dis;
    //len: 根到点u的距离
    void dfs(int u,int fa,int len){
        if(dis <len ) node = u, dis = len;
        for(int i = head[u];i!=-1;i=e[i].next){
            int v = e[i].v;
            if( v == fa) continue;
            dfs(v,u,len+e[i].w);
        }
    }
    void work(){
        dis=-1;dfs(1,0,0);   //第1次dfs
        dis=-1;dfs(node,0,0);//第2次dfs
        //得到最长的直径dis
    }
}

dp求直径

代码模板

void dp(int u) {
    vis[u] = 1;
    for(int i = e.h[u]; ~i ;i = e[i].neut) {
        int v = e[i].v;
        if(vis[v]) continue;
        dp(v);
        ans = max(ans,dp[u] + d[v] + e[i].w);
        d[u] = max(d[x],d[v] + e[i].w);
    }
}