树的最长路径

思路:

在遍历时,随便以一个结点为根节点,后续遍历即可。因为是多叉树,在求其到其它结点的最大深度时,要用两个变量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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值