• 树与数据结构——树的直径


       浅谈树的直径

      树的数据结构向来是神奇且多变的,今天来谈一下树的直径

    为后面更多有关树的数据结构打下基础

      树的直径顾名思义,就是一颗树中最大路径长度,如下图

                

        如上方这个奇丑无比的树,咱们假定每两个节点之间的路径长度为1,

      显然,他的直径应为  8或9->4->2->1->3->7,即树的直径为5

      很好,那怎么拿代码实现呢?

      思路:首先我们选择的算法是深搜,我们需要深搜两遍,第一遍随意找一点

    深搜找到离这个点最远的点,咱们就可以确定,这个点必然是一个极点(自己定义的)

      什么是极点什么事非极点?我们回到上图,假如我们第一次随机选点选到了2,

    那非常遗憾,树的直径变为2->1->3->7,这显然不是最大的直径,我定义像2这样的点是非极点,即搜到的直径不为最大直径的点,但是!我们最后找到了7,从7我们就可以搜到最的直径了,我们便称这样的点为极点

      所以深搜两遍,第一遍找到极点,第二遍深搜从极点出发就可以找到树的最大直径啦~~~

    代码:

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 vector <int> dis[200010];
     4 bool vis[200010];
     5 int n,xx,yy,ans,qwq;
     6 void dfs(int m,int deep){
     7     for(register int i=0;i<dis[m].size();i++){
     8         if(vis[dis[m][i]]) continue;
     9         vis[dis[m][i]]=1;
    10         dfs(dis[m][i],deep+1);
    11         vis[dis[m][i]]=0;
    12         if(deep>ans) qwq=m;
    13         ans=max(deep,ans);
    14     }
    15 }
    16 int main(){
    17     scanf("%d",&n);
    18     for(register int i=1;i<n;i++){
    19         scanf("%d%d",&xx,&yy);
    20         dis[xx].push_back(yy);
    21         dis[yy].push_back(xx);    
    22     }
    23     dfs(1,0);
    24     memset(vis,0,sizeof(vis));
    25     dfs(qwq,0);
    26     printf("%d",ans);
    27     return 0;
    28 }
    树的直径

      end;

  • 相关阅读:
    Swift 构造与析构
    Swift 协议
    Swift 扩展
    Swift 多态
    Swift 继承
    Swift 封装
    Swift 方法
    Swift 属性
    Swift 对象
    Swift 类
  • 原文地址:https://www.cnblogs.com/liuhailin/p/11015017.html
Copyright © 2020-2023  润新知