树的直径模板
树的直径是求一棵树最远的两点之间的距离。
套路:两次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;
}