zoukankan      html  css  js  c++  java
  • 【HDU2196 Computer】经典树形dp

    http://acm.hdu.edu.cn/showproblem.php?pid=2196

    题意:有n台电脑相连,让你求每台电脑与离它最远的那台电脑的距离。

    思路:两遍搜索即可,第一遍从上到下,第二遍从小往上。对于某点,该点的最长半径为此点离自己孩子的最大距离和父亲节点传递下来的最长距离加连接此点的权值,两者之间选择最大值,但这里处理的时候要注意了,某点的孩子距离和父亲传递下来的最大距离可能为同一路径,因为父亲节点的最大距离可能经过此点。所以在处理的过程中不仅要随时记录最长路径,还要记录一个次长路径。这里WA了几次,更新最长路径的时候,记得要提前把最长路径传递给次长路径。

    讲的很绕口。 

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <map>
     5 #include <vector>
     6 #include <algorithm>
     7 using namespace std;
     8 
     9 typedef long long lld;
    10 const lld maxn=10005;
    11 lld fmax[maxn], smax[maxn];
    12 int pre[maxn];
    13 map<int,map<int,int> >mp;
    14 
    15 struct Node
    16 {
    17     int v, val;
    18     Node(){}
    19     Node(int v_, int val_)
    20     {
    21         v=v_, val=val_;
    22     }
    23 };
    24 vector<Node>vt[maxn];
    25 
    26 void dfs(int u)
    27 {
    28     for(int i=0; i<vt[u].size(); i++)
    29     {
    30         int v=vt[u][i].v, val=vt[u][i].val;
    31         dfs(v);
    32         if(fmax[v]+val>fmax[u]) smax[u]=fmax[u],fmax[u]=fmax[v]+val; ///这里要注意了,更新fmax的同时要把fmax传递给smax(最大传递给次大)
    33         else if(fmax[v]+val>smax[u]) smax[u]=fmax[v]+val;
    34     }
    35 }
    36 
    37 void DFS(int u)
    38 {
    39     if(u==1) ;
    40     else
    41     {
    42         int fa=pre[u], val=mp[fa][u];
    43         if(fmax[u]==fmax[fa]-val)
    44         {
    45             if(smax[fa]+val>fmax[u]) smax[u]=fmax[u], fmax[u]=smax[fa]+val;
    46             else if(smax[fa]+val>smax[u]) smax[u]=smax[fa]+val;
    47         }
    48         else
    49         {
    50             if(fmax[fa]+val>fmax[u]) smax[u]=fmax[u], fmax[u]=fmax[fa]+val;
    51             else if(fmax[fa]+val>smax[u]) smax[u]=fmax[fa]+val;
    52         }
    53     }
    54     for(int i=0; i<vt[u].size(); i++)
    55         DFS(vt[u][i].v);
    56 }
    57 
    58 int main()
    59 {
    60     int n;
    61     while(cin >> n)
    62     {
    63         mp.clear();
    64         for(int i=1; i<=n; i++) fmax[i]=smax[i]=0, pre[i]=0, vt[i].clear();
    65         for(int i=2; i<=n; i++)
    66         {
    67             int u, val;
    68             scanf("%d%d",&u,&val);
    69             vt[u].push_back(Node(i,val));
    70             mp[u][i]=val;
    71             pre[i]=u;
    72         }
    73         dfs(1);
    74         DFS(1);
    75         for(int i=1; i<=n; i++)
    76             cout << fmax[i] <<endl;
    77     }
    78     return 0;
    79 }
    80 /*
    81 8
    82 1 1
    83 1 2
    84 2 2
    85 2 4
    86 3 3
    87 3 4
    88 4 3
    89 */
    View Code
  • 相关阅读:
    HashMap实现分析
    序列化与transient
    MySQL计划任务(事件调度器)(Event Scheduler)[转]
    利用innodb_force_recovery修复MySQL数据页损坏
    Java对Jar文件的操作[转]
    聚集索引与非聚集索引
    JVM学习(二)
    一句道破所有的springmvc(面试必备)
    springboot中的外界jar的引入:
    springboot中的springSession的存储和获取
  • 原文地址:https://www.cnblogs.com/kane0526/p/3250335.html
Copyright © 2011-2022 走看看