思路:
求图中两点距离最长的路径(即树的直径)
#include <iostream>
#include <algorithm>
#include <cstring>
#include <queue>
#define x first
#define y second
using namespace std;
const int N = 1e5 + 10, M = N * 2;
int h[N],e[M],ne[M],w[M],idx;
typedef pair<int,int> pii;
typedef long long ll;
int dis[N];
bool st[N];
int n;
ll ans;
void add(int a, int b, int c){
e[idx] = b, w[idx] = c, ne[idx] = h[a], h[a] = idx++;
}
ll dfs(int u, int fa){
ll dis = 0;
ll d1 = 0, d2 = 0;
for(int i = h[u]; i != -1; i = ne[i]){
int j = e[i];
if(j == fa) continue;
ll d = dfs(j,u) + w[i];
dis = max(dis,d);
if(d >= d1){
d2 = d1;
d1 = d;
}
else if(d > d2){
d2 = d;
}
}
ans = max(ans,d1 + d2);
return dis;
}
int main(){
scanf("%d",&n);
memset(h,-1,sizeof(h));
for(int i = 0 ; i < n - 1; i++){
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
add(a,b,c),add(b,a,c);
}
dfs(1,-1);
// int ans = -1;
// for(int i = 1; i <= n; i++){
// ans = max(ans,heap_dijkstra(i));
// }
//
// cout << ans << endl;
ll sum = 0;
for(ll i = 1; i <= ans; i++){
sum += (1ll)*(i + 10);
}
cout << sum << endl;
return 0;
}