书P369~371
①:树形DP
https://www.cnblogs.com/kma093/p/9742317.html

#include<bits/stdc++.h>
using namespace std;
const int maxn=2e6+10;
const double eps=1e-7;
typedef long long ll;
using namespace std; 
struct edge
{
    int to,nex,w;
}e[maxn]; 
int head[maxn],cnt; 
void add(int u,int v,int w)
{
    e[cnt].to=v;
    e[cnt].w=w;
    e[cnt].nex=head[u];
    head[u]=cnt++;
}
int ans,dp[maxn][2]; 
void init()
{
    memset(head,-1,sizeof(head));
    cnt=0;
}
void dfs(int u,int fa)
{
    for(int i=head[u];~i;i=e[i].nex)
    {
        int v=e[i].to,w=e[i].w;
        if(v==fa)continue;
        dfs(v,u);
        if(dp[v][0]+w>dp[u][0])
        {
            dp[u][1]=dp[u][0];
            dp[u][0]=dp[v][0]+w;
        }
        else dp[u][1]=max(dp[u][1],dp[v][0]+w);
    }
    ans=max(ans,dp[u][0]+dp[u][1]);
}
int main()
{ 
   int u,v,w;
   init();
   while(~scanf("%d%d%d",&u,&v,&w))
   add(u,v,w),add(v,u,w);
   dfs(1,-1);
   printf("%d\n",ans);
   return 0;
}

②:两次DFS

#include<bits/stdc++.h>
using namespace std;
const int maxn=10000;
struct abc
{
    int v,w;
};
int v[maxn];
vector<vector<abc> > a;
abc dfs(int x,int ju)
{
    abc ans;
    ans.v=x;ans.w=ju;
    v[x]=1;
    for(int i=0;i<a[x].size();i++)
    {
        if(v[a[x][i].v]==0)
        {
            abc p=dfs(a[x][i].v,ju+a[x][i].w);
            if(ans.w<=p.w)
            {
                ans.w=p.w;
                ans.v=p.v;
            }
        }
    }
    return ans;
}
int main()
{
    int n,m;
    cin>>n>>m;
    for(int i=0;i<=n;i++)
    {
        a.push_back({});
    }
    for(int i=1;i<=n;i++)
    {
        int x,y,z;
        cin>>x>>y>>z;
        abc r;
        r.v=y;r.w=z;
        a[x].push_back(r);
        r.v=x;
        a[y].push_back(r);
    }
    memset(v,0,sizeof(v));
    abc li=dfs(1,0);
    memset(v,0,sizeof(v));
    li=dfs(li.v,0);
    cout<<li.w<<endl;
    return 0;
}