进行两次bfs,然后找出最长的路径。
//两次bfs,求树的直径
#include<iostream>
#include<cstdio>
#include<vector>
#include<queue>
using namespace std;
const int maxn=1e5+5;
const int inf=(1<<30);
struct edge{
int t,w;
edge(int t,int w):t(t),w(w){}
};
vector<edge>g[maxn];
int n,d[maxn];
void bfs(int s)
{
for(int i=0;i<n;i++){
d[i]=inf;
}
queue<int>q;
q.push(s);
d[s]=0;
while(!q.empty()){
int u=q.front();
q.pop();
for(int i=0;i<g[u].size();i++){
edge e=g[u][i];
if(d[e.t]==inf){
d[e.t]=d[u]+e.w;
q.push(e.t);
}
}
}
}
void solve()
{
bfs(0);
int maxv=0,tgt;
for(int i=0;i<n;i++){
if(d[i]==inf){
continue;
}
if(maxv<d[i]){
maxv=d[i];
tgt=i;
}
}
bfs(tgt);
maxv=0;
for(int i=0;i<n;i++){
if(d[i]==inf){
continue;
}
maxv=max(maxv,d[i]);
}
cout<<maxv;
}
int main()
{
cin>>n;
int begin,to,cost;
for(int i=0;i<n-1;i++){
cin>>begin>>to>>cost;
g[begin].push_back(edge(to,cost));
g[to].push_back(edge(begin,cost));
}
solve();
return 0;
}