码迷,mamicode.com
首页 > 其他好文 > 详细

树的直径

时间:2020-01-22 21:47:43      阅读:75      评论:0      收藏:0      [点我收藏+]

标签:mat   tin   math   更新   continue   通过   for   两种   class   

可以通过两次\(dfs\)\(bfs\)求出树的直径,从任意结点出发,搜索得出直径的一个端点,然后从这个端点继续搜索,得出另一个端点,但无法处理负边权

\(code\):

void dfs_find(int x,int fa,int de)
{ 
    if(de>=maxd)
    {
        maxd=de;//更新长度
        nd=x;//更新端点
    }
    for(int i=head[x];i;i=e[i].nxt)
    {
        int y=e[i].to,v=e[i].v;
        if(y==fa) continue;
        dfs_find(y,x,de+v);
    }
}

也可以用树形\(DP\)求直径,考虑每个结点\(x\),求出经过结点\(x\)的最长链长度,则树的直径长度就是这些最长链长度的最大值,但无法求出直径的端点

\(code\):

void dp(int x,int fa)
{
    for(int i=head[x];i;i=e[i].nxt)
    {
        int y=e[i].to,v=e[i].v;
        if(y==fa) continue;
        dp(y,x);
        maxd=max(maxd,dis[x]+dis[y]+v);
        dis[x]=max(dis[x],dis[y]+v);
    }
}

巡逻,两种方法结合,巧妙运用直径

树的直径

标签:mat   tin   math   更新   continue   通过   for   两种   class   

原文地址:https://www.cnblogs.com/lhm-/p/12229476.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!