zoukankan      html  css  js  c++  java
  • 树上最远距离

    给定一颗N个节点的树,结点从1到N编号。

    现在要计算对于每个结点i,到它最远的结点是多少距离,这个值记为S_iSi

    输入

    第一行输入两个整数N(2 le N le 10^4)N(2N104)。

    接下来N-1行,每行两个整数x_i, y_i (1 le x_i, y_i le n, x_i e y_i)xi,yi(1xi,yin,xi=yi), 表示x_i, y_ixi,yi之间有一条边。

    输入保证是一棵树。

    输出

    第i行输出S_iSi

    样例

    输入

     1 /*************************************************************************
     2     > Author: Henry Chen
     3     > Mail: 390989083@qq.com 
     4     > Created Time: 鍥? 8/27 18:58:00 2020
     5  ************************************************************************/
     6 
     7 #include<bits/stdc++.h>
     8 using namespace std;
     9 vector<pair<int,int> >vec[10001];
    10 int deep[5][10001];
    11 void dfs(int u,int fa,int dep,int p)
    12 {
    13     // << u << endl;
    14     deep[p][u] = dep;
    15     for(int i = 0;i < vec[u].size();i++)
    16     {
    17         int v = vec[u][i].first;
    18         if(v != fa)
    19         {
    20             dfs(v,u,dep+vec[u][i].second,p);
    21         }
    22     }
    23 }
    24 int main()
    25 {
    26     int n;
    27     cin >> n;
    28     for(int i = 2;i <= n;i++)
    29     {
    30         int u,v;
    31         scanf("%d%d",&u,&v);
    32         vec[i].push_back(make_pair(u,v));
    33         vec[u].push_back(make_pair(i,v));
    34     }
    35     dfs(1,1,0,1);
    36     int mx = 0;
    37     int num;
    38     for(int i = 1;i <= n;i++)
    39     {
    40         if(mx < deep[1][i])
    41         {
    42             num = i;
    43             mx = deep[1][i];
    44         }
    45     }
    46     dfs(num,num,0,2);
    47     mx = 0;
    48     for(int i = 1;i <= n;i++)
    49     {
    50         if(mx < deep[2][i])
    51         {
    52             num = i;
    53             mx = deep[2][i];
    54         }
    55     }
    56     dfs(num,num,0,3);
    57     for(int i = 1;i <= n;i++)
    58     {
    59         printf("%d
    ",max(deep[2][i],deep[3][i]));
    60     }
    61     return 0;
    62 }
    5
    1 1
    2 1
    3 1
    1 1

    输出

    3
    2
    3
    4
    4

    提示

    15888965476074.png

    结点4到结点1最远, S_1 = 3  S1=3 。

    结点4和结点5到结点2都是最远的, S_2 = 2  S2=2 。

    结点5到结点3距离最远, S_3 = 3  S3=3 。

    结点5到结点4距离最远, S_4 = 4  S4=4 。

    结点4到结点5距离最远, S_5 = 4  S5=4 。

  • 相关阅读:
    centos7之添加开机启动服务/脚本
    高性能 Windows C++ 通用组件 VCLogger v2.0.3 正式发布
    Kerberos认证流程
    使用Spring.Net+NHibernate构建WCF应用
    国家重点基础研究发展计划和重大科学研究计划方向
    项目实现思路(不断更新)
    LINQ新特性简介及入门教程
    XXX公司CRM项目开发日志
    GridView的增删改查和分页
    团队开发之环境搭建
  • 原文地址:https://www.cnblogs.com/mzyy1001/p/13574463.html
Copyright © 2011-2022 走看看