题意分析
题目说要寻找树的最长路径。 最长路径一定经过某个点。这个点拥有最长路径和次长的路径(可以看成多件物品悬挂在一点),也就是搜索每一个点,取寻找最长路径和次长路径。在进行求解时,要防止路径向上行走,也就是不向父节点走。
重点为dfs对每个点的遍历 :不断地对每个点进行计算,来求最大值和次大值,两者的和为最长路径。
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N =10010,M=2*N;
int n;
int h[N],ne[M],e[M],idx,w[M];
int ans;
void add(int a,int b,int c)
{
e[idx]=b,w[idx]=c,ne[idx]=h[a],h[a]=idx++;
}
int dfs(int u,int father) //当前这个点 当前这个点的父亲节点 找到u点向下走的最长路径
{
int dist=0;
int d1=0,d2=0;//d1为第一长直径,d2为第二长直径
for(int i=h[u];~i;i=ne[i]) //遍历整个图
{
int j=e[i]; //孩子节点
if(j==father) continue; //防止在两个点直接进行循环跳跃,因为它是无向图。
int d=dfs(j,u)+w[i];
dist=max(dist,d); //最大路径
if(d>=d1) d2=d1,d1=d; //如果当前的路径值大于最大值,那么对最大值和次大值进行更新。
else if(d>d2) d2=d;//如果大于次大值小于最大值,则只更新次大值。
}
ans=max(ans,d1+d2); //最长路径等于最大值加上次大值。
return dist;
}
int main()
{
cin>>n;
memset(h,-1,sizeof h);
for(int i=0;i<n-1;i++)
{
int a,b,c;
cin>>a>>b>>c;
add(a,b,c),add(b,a,c); //无向图
}
dfs(1,-1);//根节点为1,其父亲节点为-1,(父亲节点也可以是其他值)
cout<<ans<<endl;
return 0;
}