zoukankan      html  css  js  c++  java
  • 树的直径及重心

    1.树的直径

    树上最长的简单路径即为树的直径。

    求树的直径的方法就是在树上任选一点u,求距离点u最远的点y,再求距离点y最远的点s,点y到点s的距离即为树的直径。

     1 #include<cstdio>
     2 #include<cstring>
     3 #define N 4200
     4 struct hehe{
     5     int next;
     6     int to;
     7 }edge[N];
     8 int num_edge,head[N],dis[N],n,a,b,y;
     9 int add_edge(int from,int to){
    10     edge[++num_edge].next=head[from];
    11     edge[num_edge].to=to;
    12     head[from]=num_edge;
    13 }
    14 int dfs(int x){
    15     for(int i=head[x];i;i=edge[i].next)
    16         if(!dis[edge[i].to]){
    17             dis[edge[i].to]=dis[x]+1;
    18             dfs(edge[i].to);
    19         }
    20 }
    21 int main(){
    22     scanf("%d",&n);
    23     for(int i=1;i<n;++i){
    24         scanf("%d%d",&a,&b);
    25         add_edge(a,b);
    26         add_edge(b,a);
    27     }
    28     dfs(1);
    29     for(int i=y=1;i<=n;i++)
    30         if(dis[i]>dis[y])
    31             y=i;
    32     memset(dis,0,sizeof(dis));
    33     dfs(y);
    34     for(int i=y=1;i<=n;i++)
    35         if(dis[i]>dis[y])
    36             y=i;
    37     printf("%d",dis[y]);
    38     return 0;
    39 } 
    View Code

    2.树的重心

    若有一点,其所有子树中最大子树的节点数最少,则该点就是这棵树的重心。

    一般的树只有一个重心,有些有偶数个节点的树,有两个节点。

    求树的重心方法就是随意确定一个根节点,先把无根树转化为有根树,dfs求出所有点的子树的节点个数。如果有一点满足该点的子树的节点数的二倍大于等于总结点数(size[u]*2>=n),并且该点的儿子都满足子树的节点数的二倍小于等于总结点数(size[son_u]*2<=n),这个点就是树的重心。

     1 #include<cstdio>
     2 #define N 42000
     3 int n,a,b,next[N],to[N],head[N],num,size[N],father[N],ans;
     4 void add(int false_from,int false_to){
     5     next[++num]=head[false_from];
     6     to[num]=false_to;
     7     head[false_from]=num;
     8 }
     9 void dfs(int x){
    10     size[x]=1;
    11     for(int i=head[x];i;i=next[i])
    12         if(father[x]!=to[i]){
    13             father[to[i]]=x;
    14             dfs(to[i]);
    15             size[x]+=size[to[i]];
    16         }
    17     if(size[x]*2>=n&&!ans)
    18         ans=x;
    19 }
    20 int main(){
    21     scanf("%d",&n);
    22     for(int i=1;i<n;++i){
    23         scanf("%d%d",&a,&b);
    24         add(a,b);
    25         add(b,a);
    26     }
    27     dfs(1);
    28     printf("%d",ans);
    29     return 0;
    30 }
    View Code
  • 相关阅读:
    对软件工程课程的期望
    自我介绍
    新目标
    课后作业-阅读任务-阅读笔记-4
    20150914-构建之法:现代软件工程-阅读笔记
    团队编程项目作业2-团队编程项目开发环境搭建过程
    团队编程项目作业2-团队编程项目设计文档
    个人-GIT使用方法
    结对编程项目作业2-结对编项目设计文档
    结对编程项目作业2-开发环境搭建过程
  • 原文地址:https://www.cnblogs.com/jsawz/p/6809817.html
Copyright © 2011-2022 走看看