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

树的直径

时间:2019-08-13 13:48:04      阅读:138      评论:0      收藏:0      [点我收藏+]

标签:code   style   交点   连接   bsp   for   定义   strong   next   

定义:

   树的直径指树上距离最远的两点间的距离。

性质:

①  直径两端点一定是两个叶子节点。
②  距离任意点最远的点一定是直径的一个端点,这个基于贪心求直径方法的正确性可以得出。
③  对于两棵树,如果第一棵树直径两端点为(u,v),第二棵树直径两端点为(x,y),用一条边将两棵树连接,那么新树的直径一定是u,v,x,y,中的两个点。
④  对于一棵树,如果在一个点的上接一个叶子节点,那么最多会改变直径的一个端点。
⑤  若一棵树存在多条直径,那么这些直径交于一点且交点是这些直径的中点。

求解:

DP:

    令dp[s]为s子树方向的最大距离,ans为直径。

void DP(int s,int fa)
{
  int i,v;
  for(i=head[s];i!=-1;i=e[i].next)
   {
      v=e[i].v;
      if(v==fa) continue;
      DP(v,s);
      ans=max(ans,dp[s]+dp[v]+e[i].w);
      dp[s]=max(dp[s],dp[v]+e[i].w);
   }
}

 

DFS|BFS:

    任意找一点为根,进行BFS|DFS找到最远点A,以A为根,进行BFS|DFS找到最远点B,AB则为直径。

    ①DFS(1,-1,0); ②DFS(A,-1,0); pos表示最远点。

void DFS(int s,int fa,int deep)
{
  int i,v;
  if(mmax<deep) mmax=deep,pos=s;
  for(i=head[s];i!=-1;i=e[i].next)
  {
    v=e[i].v;
    if(v==fa) continue;
    DFS(v,s,deep+1);
  }
}

树的直径

标签:code   style   交点   连接   bsp   for   定义   strong   next   

原文地址:https://www.cnblogs.com/VividBinGo/p/11345187.html

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