树形dp求树的直径,裸题
// x(km) -> 10 * x + (x + 1) * x / 2
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 1e5 + 5, M = N * 2;
int n, e[M], ne[M], h[N], we[M], ans, idx;
void add(int a, int b, int w){
e[idx] = b; we[idx] = w; ne[idx] = h[a]; h[a] = idx ++;
}
int dfs(int u, int fa){
int dist = 0;
int d1 = 0, d2 = 0; // 最大,次大
for(int i = h[u]; i != -1; i = ne[i]){
int j = e[i];
if(j == fa) continue;
int d = dfs(j, u) + we[i];
dist = max(dist, d);
if(d >= d1) d2 = d1, d1 = d;
else if(d > d2) d2 = d;
}
ans = max(ans, d1 + d2);
return dist;
}
int main(){
memset(h, -1, sizeof h);
cin >> n;
while( -- n ){
int a, b, w;
scanf("%d%d%d", &a, &b, &w);
add(a, b, w); add(b, a, w);
}
dfs(1, -1);
long long x = ans;
cout << 10 * x + (x + 1) * x / 2;
return 0;
}