传送门
题意:
#include <bits/stdc++.h>
using namespace std;
typedef pair<int,int> piir;
typedef long long ll;
const int maxn = 1e5+5;
const int INF = 0x3f3f3f3f;
int n;
bool vis[maxn];
ll dist1[maxn],dist2[maxn];
vector<piir>G[maxn];
void init(){
for(int i=0;i<=n+2;i++) G[i].clear();
memset(dist1,0,sizeof(dist1));
memset(dist2,0,sizeof(dist2));
memset(vis,0,sizeof(vis));
}
void dfs(int u,ll dis,ll *dist){
vis[u] = 1;
dist[u] = dis;
for(auto &it:G[u]){
int v;ll w;tie(v,w)=it;
if(!vis[v]) dfs(v,dis+w,dist);
}
}
int main() {
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
#endif
while(~scanf("%d",&n)){
init();
for(int i=1;i<n;i++){
int u,v;ll w;
scanf("%d%d%lld",&u,&v,&w);
G[u].emplace_back(v,w);
G[v].emplace_back(u,w);
}
int st,ed;
ll ma = -INF;
dfs(1,0,dist1);//求出树的直径
for(int i=1;i<=n;i++)//寻找树的直径的第一个ends
if(dist1[i] > ma) ma = dist1[i],st=i;
memset(vis,0,sizeof(vis));
dfs(st,0,dist1);//更新
ma = -INF;
for(int i=1;i<=n;i++)
if(dist1[i] > ma) ma = dist1[i],ed=i;
memset(vis,0,sizeof(vis));
dfs(ed,0,dist2);
ll ans = 0;
for(int i=1;i<=n;i++)
ans += max(dist1[i],dist2[i]);
ans -= dist2[st];
printf("%lld\n",ans);
}
return 0;
}