有一组是答案错误 是树的直径搜索模板
#include<bits/stdc++.h>
#define rep(i,j,k) for(register int i(j);i!=(k+1);++i)
using namespace std;
const int N=500007;
int u[N],ver[N],head[N],next[N],ans[N],edge[N],best,onev,firstv,secondv,tot;
int stmin[N][50],stmax[N][50];
void addedge(int x,int y,int z) {
ver[++tot]=y;
next[tot]=head[x];
head[x]=tot;
edge[tot]=z;
}
void dfs_v(int vv,int maxl,int fath) {
if (maxl>u[vv])
u[vv]=maxl;
for(register int i(head[vv]); i; i=next[i]) {
int y=ver[i];
if(fath==y) continue;
dfs_v(y,maxl+edge[i],vv);
}
}
int n,m;
void dfs_ans(int vv,int maxl,int fath) {
if (maxl>ans[vv]) ans[vv]=maxl;
for(register int i(head[vv]); i; i=next[i]) {
int y=ver[i];
if(fath==y) continue;
dfs_v(y,maxl+edge[i],vv);
}
}
inline void read(int &x) {
x=0;
register char ch=getchar();
int w=0;
while(ch>'9'||ch<'0') {
w|=ch=='-';
ch=getchar();
}
while(ch>='0'&&ch<='9') {
x=(x<<1)+(x<<3)+(ch&15);
ch=getchar();
}
w?x=~(x-1):x;
}
inline void init() {
rep(i,1,n) stmin[i][0] =stmax[i][0]=ans[i];
for (int j = 1; (1 << j) <= n; j++)
for (int i = 1; i + (1 << j) - 1 <= n; i++) {
stmin[i][j]=min(stmin[i][j-1],stmin[i+(1<<(j-1))][j-1]);
stmax[i][j]=max(stmin[i][j-1],stmax[i+(1<<(j-1))][j-1]);
}
}
inline int qmax(int l, int r) {
int k = log2(r - l + 1);
int x = stmax[l][k], y = stmax[r - (1 << k) + 1][k];
return x > y ? x : y;
}
inline int qmin(int l, int r) {
int k = log2(r - l + 1);
int x = stmin[l][k], y = stmin[r - (1 << k) + 1][k];
return x < y ? x : y;
}
int main() {
// freopen("d.in","r",stdin);
// freopen("d.out","w",stdout);
read(n);
// read(m);
rep(i,2,n) {
int x,y,z;
read(x);
read(y);
read(z);
addedge(x,y,z);
addedge(y,x,z);
// int j,k;
// read(j);
// read(k);
// addedge(j,i,k);
// addedge(i,j,k);
}
best=0;
dfs_v(1,0,0);
int maxx=-2146465;
rep(i,1,n) {
if(maxx<u[i]) {
maxx=u[i];
onev=i;
}
}
firstv=onev;
memset(u,0,sizeof u);
dfs_v(firstv,0,0);
maxx=-2146465;
rep(i,1,n) {
if(maxx<u[i]) {
maxx=u[i];
}
}
cout<<maxx;
// rep(i,1,n)
// secondv=onev;
// dfs_ans(firstv,0,0);
// dfs_ans(secondv,0,0);
// init();
//
// int h=1;
// int ans=-1;
// for(int i=1;i<=n;i++)
// {
// while(qmax(h,i)-qmin(h,i)>m) h++;
// ans=max(ans,i-h+1);
// }
//
// cout<<ans;
}