• 树上最远距离


    给定一颗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 。

  • 相关阅读:
    app缓存设计-文件缓存
    设计模式-模板方式
    设计模式-观察者模式
    java 类加载顺序
    Java项目添加log4j日志文件错误记录
    如何在eclipse中配置反编译工具JadClipse
    eclipse反编译插件jadClipse安装使用教程
    StringUtils工具类的isBlank()方法使用说明
    SLF4J: Failed to load class的问题及解决
    GitHub的Fork 是什么意思
  • 原文地址:https://www.cnblogs.com/mzyy1001/p/13574463.html
Copyright © 2020-2023  润新知