// //

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

   浅谈树的直径

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

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

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

            

 

    如上方这个奇丑无比的树,咱们假定每两个节点之间的路径长度为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;

 

posted @ 2019-06-13 11:10  Zafkiel  阅读(570)  评论(2编辑  收藏  举报
Live2D //博客园自带,可加可不加