先查找一遍树的直径,然后枚举每一个点,并求如下式子的max即是答案(bx,by为树的直径的两个端点,表示bx到i的距离,,表示 by 到 i 的距离,容易知道 是树的直径)
#include<bits/stdc++.h>
#define int long long
#define mp(x,y) make_pair(x,y)
using namespace std;
const int F=6000000;
const int P=11451419198;
int n,m,tot,bx,by,num,out;
int head[F],nxt[F],ver[F],edg[F],dis[3][F],v[F],ed[F];
priority_queue<pair<int,int>> q;
void add(int x,int y,int z){
ver[++tot]=y;
nxt[tot]=head[x];
head[x]=tot;
edg[tot]=z;
}
void djstl(int s,int ml){
for(int i=1;i<=n;i++){
dis[ml][i]=P;
v[i]=0;
}
dis[ml][s]=0;
q.push(mp(0,s));
while(q.size()){
int x=q.top().second;
q.pop();
if(v[x]) continue;
v[x]=1;
for(int i=head[x];i;i=nxt[i]){
int y=ver[i];
if(dis[ml][y]>dis[ml][x]+edg[i]){
dis[ml][y]=dis[ml][x]+edg[i];
q.push(mp(-dis[ml][y],y));
}
}
}
}
void fst(){
ios::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
}
signed main(){
freopen("try.in","r",stdin);
fst();
cin>>n>>m;
while(m--){
int x,y,z;
cin>>x>>y>>z;
add(x,y,z); add(y,x,z);
}
djstl(1,1);
for(int i=1;i<=n;i++){
if(num<dis[1][i]){
bx=i; num=dis[1][i];
}
}
djstl(bx,1);
num=0;
for(int i=1;i<=n;i++){
if(num<dis[1][i]){
by=i; num=dis[1][i];
}
}
djstl(by,2);
for(int i=1;i<=n;i++){
out=max(dis[1][by]+min(dis[1][i],dis[2][i]),out);
}
cout<<out<<endl;
return 0;
}