输入样例:
5
1 2 2
1 3 1
2 4 5
2 5 4
输出样例:
135
#include <bits/stdc++.h>
using namespace std;
#define int long long int
const int N=1e5+5;
int n,u,v,w;
struct edge{
int to,nxt,w;
}e[N<<1];
int head[N];
int cnt;
void add(int u,int v,int w){
e[++cnt].w=w;
e[cnt].to=v;
e[cnt].nxt=head[u];//同一个起点 上一条边的编号
head[u]=cnt;
}
int f1[N];//f1[i],节点i到叶子节点的最大距离
int f2[N];
int maxd=-1;//直径
void dfs(int u,int fa){
for(int i=head[u];i;i=e[i].nxt){
int to=e[i].to;
int w=e[i].w;
if(to==fa)continue;
dfs(to,u);
if(f1[to]+w>f1[u]){
f2[u]=f1[u];
f1[u]=f1[to]+w;
}
else f2[u]=f1[to]+w;
maxd=max(maxd,f1[u]+f2[u]);
}
}
signed main(){
cin>>n;
for(int i=1;i<n;i++){
cin>>u>>v>>w;
add(u,v,w);
add(v,u,w);
}
dfs(1,0);//树形dp,从节点1开始,第2个参数往往是父节点编号,防止陷入循环
int res=0;
for(int i=1;i<=maxd;i++){
res+=(i+10);
}
cout<<res;
return 0;
}