通过样例画好图之后,求最长路径,可以很明显的知道,最长路径是有节点的最长路径和第二长路径组成,所有引用一个数组记录每个节点的最长路径和第二长路径,同时在遍历的时候还要更新父节点的路径,父节点的最长路径是每个节点的最长路径加上父子节点之间的距离
#include<bits/stdc++.h>
using namespace std;
const int N=10010,M=N<<1;
int h[N],e[M],ne[M],w[M],idx,f[N][2];
int n;
void add(int a,int b,int c)
{
e[idx]=b,ne[idx]=h[a],w[idx]=c,h[a]=idx++;
}
void dfs(int u,int fa)
{
if(h[u]==-1) return ;
for(int i=h[u];i!=-1;i=ne[i])
{
int j=e[i];
if(j==fa) continue;
dfs(j,u);
int x=f[j][0]+w[i];
if(f[u][0]<=x) f[u][1]=f[u][0],f[u][0]=x;
else if(f[u][1]<=x) f[u][1]=x;
}
}
int main()
{
cin>>n;
memset(h,-1,sizeof h);
for(int i=1;i<n;i++)
{
int a,b,c;
cin>>a>>b>>c;
add(a,b,c),add(b,a,c);
}
dfs(1,0);
int res=-1e9;
for(int i=1;i<=n;i++)
res=max(res,f[i][0]+f[i][1]);
cout << res << endl;
return 0;
}