@the_xin借鉴大佬的思路
首先对根节点进行dfs,求出离根节点最远的点,可以证明,离根节点最远的点一定在树的直径上
那么我们就可以分为这样几步
1.找出离根节点最远的点,记为dian ,做一遍dfs
2.然后以dian 为根,再进行一遍dfs,找出离dian最远的点,那么他们之间的距离就是答案,也就是树的直径
#include<bits/stdc++.h>
using namespace std;
const int N=2e4+100;//记得开二倍大小的数组
int dian;
int dis[N];
int n;
int ne[N],idx,head[N],ver[N],e[N];
inline int read()
{
int x=0;
int f=1;
char ch;
ch=getchar();
while(ch>'9'||ch<'0')
{
if(ch=='-')
f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9')
{
x=x*10,x=x+ch-'0';
ch=getchar();
}
return x*f;
}
void add(int u,int v,int w)
{
ne[idx]=head[u];
ver[idx]=v;
head[u]=idx;
e[idx]=w;
idx++;
}
void dfs(int u,int fa,int cnt)
{
dis[u]=max(dis[u],cnt);
for(int i=head[u];i!=-1;i=ne[i])
{
int j=ver[i];
int w=e[i];
if(j!=fa)
{
dfs(j,u,cnt+w);
}
}
}
int main()
{
n=read();
memset(head,-1,sizeof(head));
for(int i=1;i<=n-1;i++)
{
int a,b,c;
a=read();
b=read();
c=read();
add(a,b,c);
add(b,a,c);
}
dfs(1,1,0);
int res=0;
for(int i=1;i<=n;i++)
{
if(dis[i]>res)
{
res=dis[i];
dian=i;
}
}
memset(dis,0,sizeof(dis));
dfs(dian,dian,0);
int ans=0;
for(int i=1;i<=n;i++)
{
ans=max(ans,dis[i]);
}
cout<<ans<<endl;
}