求树的直径

// 我们将一棵树T = ( V,E )的直径定义为maxδ ( u,v ) ( u,v ∈ V ),也就是说,树中所有最短路径距离的最大值即为树的直径。
// 对于树的直径呢,我们老师给我们介绍了两种做法,一种是用两次bfs(或者dfs),另一种是用树形DP
// 对于树的直径,两种做法,一种是用两次bfs(或者dfs),另一种是用树形DP
// 两次dfs 先从任意一点P出发,找离它最远的点Q,再从点Q出发,找离它最远的点W,W到Q的距离就是是的直径
//至于树形dp,难,略
#include<bits/stdc++.h>
using namespace std;
const int N=20000+10;
int n,ans=0,first[N],next1[N],u[N],v[N],w[N],d[N]={0},mxx=0,pt=0;
void dfs1(int rt,int f,int l){
    if(l>mxx){
        mxx=l;
        pt=rt;
    }
    for(int i=first[rt];i!=-1;i=next1[i]){
        if(v[i]==f) continue;
        dfs1(v[i],rt,l+w[i]);
    }
}
void dfs2(int rt,int f,int l){
    ans=max(ans,l);
    for(int i=first[rt];i!=-1;i=next1[i]){
        if(v[i]==f) continue;
        dfs2(v[i],rt,l+w[i]);
    }
}
int main() {
    cin>>n;
    memset(first,255, sizeof(first));
    memset(next1,255, sizeof(next1));
    for(int i=1;i<n;i++){
        cin>>u[i]>>v[i]>>w[i];
        next1[i]=first[u[i]];
        first[u[i]]=i;
        u[i+n]=v[i];
        v[i+n]=u[i];
        w[i+n]=w[i];
        next1[i+n]=first[u[i+n]];
        first[u[i+n]]=i+n;
    }
    dfs1(1,-1,0);
    dfs2(pt,-1,0);
    cout<<pt<<endl;
    cout<<ans<<endl;
    return 0;
}
原文地址:https://www.cnblogs.com/MorrowWind/p/13056524.html