思路:
在遍历时,随便以一个结点为根节点,后续遍历即可。因为是多叉树,在求其到其它结点的最大深度时,要用两个变量first和second,表示该结点到其它结点的最大深度和次大深度。在以某个结点为根节点的树中,最远两个结点的距离为first+second
代码实现:
#include <bits/stdc++.h>
using namespace std;
typedef long long int ll;
struct edge
{
int to;
int cost;
edge(int x,int w):to(x),cost(w){}
};
vector<edge> g[23339];
inline void addedge(int x,int y,int w)
{
g[x].push_back(edge(y,w));
g[y].push_back(edge(x,w));
}
int n;
ll ma=-1;
int dfs(int pre,int cur,int w)
{
ll ft,sd;
ft=sd=0;
for(int i=0;i<g[cur].size();i++)
if(g[cur][i].to!=pre)
{
int tp=dfs(cur,g[cur][i].to,g[cur][i].cost);
if(tp>ft)
{
sd=ft;
ft=tp;
}
else
if(tp>sd)
sd=tp;
}
ma=max(ma,ft+sd);
return ft+w;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin>>n;
int x,y,w;
for(int i=1;i<=n-1;i++)
{
cin>>x>>y>>w;
addedge(x,y,w);
}
dfs(0,1,0);
ll s=ma*10+ma*(ma+1)/2;
cout<<s<<endl;
return 0;
}