#include<cstdio>
#include<vector>
#include<algorithm>
#include<cstring>
#include<cctype>
#define maxn 100005
#define num ch-'0'
using namespace std;
int n,v,maxnum,loc,dis[maxn],sum;
vector<int>son[maxn],dat[maxn];
void get(int &res){
char ch;res=0;
while(!isdigit(ch=getchar()));
for(res=num;isdigit(ch=getchar());res=res*10+num);
}
void dfs(int now,int past){
if(dis[loc]<dis[now])
loc=now;
for(int i=0;i<son[now].size();i++)
if(son[now][i]!=past)
{
dis[son[now][i]]=dis[now]+dat[now][i];
dfs(son[now][i],now);
}
}
int main(){
get(n),get(v);
int x,y,z;
for(int i=1;i<n;i++){
get(x),get(y),get(z);
son[x].push_back(y);dat[x].push_back(z);
son[y].push_back(x);dat[y].push_back(z);
sum+=z;
}
loc=v;dis[v]=0;
dfs(v,-1);
memset(dis,127,sizeof dis);
dis[loc]=0;
dfs(loc,-1);
printf("%d",dis[loc]);
}
或者只用一次dfs
#include<bits/stdc++.h>
#define maxn 100005
using namespace std;
int n;
int info[maxn],Prev[maxn<<1],to[maxn<<1],cst[maxn<<1],cnt_e;
inline void Node(int u,int v,int ct){ Prev[++cnt_e]=info[u],info[u]=cnt_e,to[cnt_e]=v,cst[cnt_e]=ct; }
int Maxlen = 0;
int dfs(int now,int ff)
{
int Bst = 0 ,sst = 0;
for(int i=info[now];i;i=Prev[i])
if(to[i]!=ff)
{
sst = dfs(to[i],now) + cst[i];
Maxlen = max(Maxlen , sst + Bst);
Bst = max(Bst , sst);
}
return Bst;
}
int main()
{
scanf("%d",&n);
for(int i=1,u,v,ct;i<n;i++) scanf("%d%d%d",&u,&v,&ct),Node(u,v,ct),Node(v,u,ct);
dfs(1,0);
printf("%d\n",Maxlen);
}