树的直径模板

树的直径是求一棵树最远的两点之间的距离。

套路:两次dfs,一次dfs求离根最远的结点A,再以A为根搜索离A最远的结点B,A到B就是树的直径(双向的树)

#include<bits/stdc++.h>
using namespace std;
const int N=100010;

int n;
struct node{
  int idx,value;   //value: distance from this to idx
};
vector<node> h[N];
int dis[N];

void dfs(int u,int f,int distance){
    dis[u]=distance;
    for(auto node:h[u]){
        if(node.idx!=f){
            dfs(node.idx,u,dis[u]+node.value);
        }
    }
}

int main(){
    cin>>n;
    for(int i=1;i<=n;i++){
        int p,q,d;
        scanf("%d%d%d",&p,&q,&d);
        h[p].push_back({q,d});
        h[q].push_back({p,d});
    }
    //first dfs to find max distance from root to a leaf node;
    //param:1.root   2.father   3.distance from root
    dfs(1,-1,0);
    int u; //save max distance;
    for(int i=1;i<=n;i++){
        if(dis[i]>dis[u])   u=i;
    }
    
    dfs(u,-1,0);
    for(int i=1;i<=n;i++){
        if(dis[i]>dis[u])   u=i;
    }
    
    long long sum = dis[u]; //calculate
    sum = sum*10 + sum*(sum+1)/2;
    cout<<sum;
    
}
posted @ 2022-01-28 17:42  秋月桐  阅读(49)  评论(0编辑  收藏  举报