• hdu 2196(树的最长链)


    题意:输出从一颗树中所有结点出发可以走的最长的路。

    思路:先找到树上最长链然后判断两个端点中到每个结点远的距离就是答案。

    代码如下:

     1 #include <stdio.h>
     2 #include <string.h>
     3 #include <iostream>
     4 #include <algorithm>
     5 #include <vector>
     6 #include <queue>
     7 #include <set>
     8 #include <map>
     9 #include <string>
    10 #include <math.h>
    11 #include <stdlib.h>
    12 #include <time.h>
    13 #define MP(a, b) make_pair(a, b)
    14 #define PB(a) push_back(a)
    15 using namespace std;
    16 
    17 const int LEN = 10010;
    18 const int INF = 0x3f3f3f3f;
    19 typedef pair<int, int> pii;
    20 vector<pii> Map[LEN];
    21 int n, vis[LEN], dis[LEN], disa[LEN];
    22 
    23 
    24 int bfs(int v){
    25     queue<int> q;
    26     memset(vis, 0, sizeof vis);
    27     memset(dis, 0, sizeof dis);
    28     q.push(v);
    29     vis[v] = 1;
    30     while(!q.empty()){
    31         int nv = q.front(); q.pop();
    32         for(int i=0; i<Map[nv].size(); i++){
    33             int x = Map[nv][i].first;
    34             if(!vis[x]){
    35                 vis[x] = 1;
    36                 dis[x] = dis[nv] + Map[nv][i].second;
    37                 q.push(x);
    38             }
    39         }
    40     }
    41     int maxv = -INF, maxn;
    42     for(int i=0; i<n; i++){
    43         if(maxv < dis[i]){
    44             maxv = dis[i];
    45             maxn = i;
    46         }
    47     }
    48     return maxn;
    49 }
    50 
    51 int main()
    52 {
    53  //   freopen("in.txt","r",stdin);
    54  //   freopen("out.txt","w",stdout);
    55     
    56     int a, b;
    57     while(scanf("%d", &n)!=EOF){
    58         for(int i=0; i<LEN; i++) Map[i].clear();
    59         for(int i=1; i<n; i++){
    60             scanf("%d%d", &a, &b);
    61             a--;
    62             Map[i].PB(MP(a, b));
    63             Map[a].PB(MP(i, b));
    64         }
    65         int vexa = bfs(0);
    66         int vexb = bfs(vexa);
    67         for(int i=0; i<n; i++)disa[i] = dis[i];
    68         bfs(vexb);
    69         for(int i=0; i<n; i++){
    70             printf("%d
    ", max(disa[i], dis[i]));
    71         }
    72     }
    73     return 0;
    74 }
    View Code
  • 相关阅读:
    【C++ 系列笔记】03 C++ 面向对象进阶
    【C++ 系列笔记】02 C++ 面向对象基础
    【C++ 系列笔记】01 C++ 与 C
    【JavaScript】简单取随机数 ~~(Math.random() * number)
    英语测试
    Linux指令入门
    RE-攻防世界 T3 insanity
    PWN-攻防世界 level0
    ISCC不会的理论题
    kali linux配置ssh
  • 原文地址:https://www.cnblogs.com/shu-xiaohao/p/3703558.html
Copyright © 2020-2023  润新知