题目链接:https://vjudge.net/problem/HDU-2196

题意:给出一棵树,求每个结点可以到达的最远距离。

思路:

  如果求得是树上最长距离,两次bfs就行。但这里求的是所有点的最远距离,树形dp的经典题,想了一个小时,还是dp做得太少。分析可得对任意结点u,它的最长距离要么是向下延伸的最长距离,要不向上延伸的最长距离。

  我们用dp[u][0]表示节点u向下(子结点)的最长距离,pt[u]记录该最长距离经过的第一个子结点编号,比如最长距离经过u->v,那么pt[u]=v。dp[u][1]记录u向下的次短距离,dp[u][0]、dp[u][1]通过一次dfs可以得到,该dfs是由子结点得到父结点的信息。

  dp[u][2]记录节点u向上(父结点)的最长距离,假设u的父结点为k,分两种情况考虑:

    1.pt[k]=u(k向下的最长路经过u):dp[u][2]=wku+max(dp[k][1],dp[k][2]),即父结点走次长距离,还是向上距离。

    2.pt[k]!=u:dp[u][2]=wku+max(dp[k][0],dp[k][2]),即父结点走最长距离,还是向上距离。

  对每个结点,结果为max(dp[u][0],dp[u][2])。

AC代码:

  1. #include<cstdio>
  2. #include<algorithm>
  3. #include<cstring>
  4. using namespace std;
  5.  
  6. const int maxn=;
  7. struct node{
  8. int v,w,nex;
  9. }edge[maxn];
  10. int n,dp[maxn][],pt[maxn],head[maxn],cnt;
  11.  
  12. void adde(int u,int v,int w){
  13. edge[++cnt].v=v;
  14. edge[cnt].w=w;
  15. edge[cnt].nex=head[u];
  16. head[u]=cnt;
  17. }
  18.  
  19. void dfs1(int u){
  20. dp[u][]=dp[u][]=pt[u]=;
  21. for(int i=head[u];i;i=edge[i].nex){
  22. int v=edge[i].v,w=edge[i].w;
  23. dfs1(v);
  24. if(dp[v][]+w>=dp[u][]){
  25. pt[u]=v;
  26. dp[u][]=dp[u][];
  27. dp[u][]=dp[v][]+w;
  28. }
  29. else if(dp[v][]+w>dp[u][])
  30. dp[u][]=dp[v][]+w;
  31. }
  32. }
  33.  
  34. void dfs2(int u){
  35. for(int i=head[u];i;i=edge[i].nex){
  36. int v=edge[i].v,w=edge[i].w;
  37. if(pt[u]==v) dp[v][]=w+max(dp[u][],dp[u][]);
  38. else dp[v][]=w+max(dp[u][],dp[u][]);
  39. dfs2(v);
  40. }
  41. }
  42.  
  43. int main(){
  44. while(~scanf("%d",&n)){
  45. cnt=;
  46. memset(head,,sizeof(head));
  47. for(int i=;i<=n;++i){
  48. int u,w;
  49. scanf("%d%d",&u,&w);
  50. adde(u,i,w);
  51. }
  52. dfs1();
  53. dfs2();
  54. for(int i=;i<=n;++i)
  55. printf("%d\n",max(dp[i][],dp[i][]));
  56. }
  57. return ;
  58. }

hdoj2196(树形dp,树的直径)的更多相关文章

  1. HDU 2196.Computer 树形dp 树的直径

    Computer Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Su ...

  2. hdu 4607 树形dp 树的直径

    题目大意:给你n个点,n-1条边,将图连成一棵生成树,问你从任意点为起点,走k(k<=n)个点,至少需要走多少距离(每条边的距离是1): 思路:树形dp求树的直径r: a:若k<=r+1 ...

  3. computer(树形dp || 树的直径)

    Computer Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Su ...

  4. VIJOS1476旅游规划[树形DP 树的直径]

    描述 W市的交通规划出现了重大问题,市政府下决心在全市的各大交通路口安排交通疏导员来疏导密集的车流.但由于人员不足,W市市长决定只在最需要安排人员的路口安放人员.具体说来,W市的交通网络十分简单,它包 ...

  5. POJ 3162.Walking Race 树形dp 树的直径

    Walking Race Time Limit: 10000MS   Memory Limit: 131072K Total Submissions: 4123   Accepted: 1029 Ca ...

  6. Computer(HDU2196+树形dp+树的直径)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2196 题目: 题意:有n台电脑,每台电脑连接其他电脑,第i行(包括第一行的n)连接u,长度为w,问你每 ...

  7. poj3162 树形dp|树的直径 + 双单调队列|线段树,好题啊

    题解链接:https://blog.csdn.net/shiqi_614/article/details/8105149 用树形dp是超时的,, /* 先求出每个点可以跑的最长距离dp[i][0|1] ...

  8. hdu-2169 Computer(树形dp+树的直径)

    题目链接: Computer Time Limit: 1000/1000 MS (Java/Others)     Memory Limit: 32768/32768 K (Java/Others) ...

  9. 树形DP+树状数组 HDU 5877 Weak Pair

    //树形DP+树状数组 HDU 5877 Weak Pair // 思路:用树状数组每次加k/a[i],每个节点ans+=Sum(a[i]) 表示每次加大于等于a[i]的值 // 这道题要离散化 #i ...

  10. [HDU 5293]Tree chain problem(树形dp+树链剖分)

    [HDU 5293]Tree chain problem(树形dp+树链剖分) 题面 在一棵树中,给出若干条链和链的权值,求选取不相交的链使得权值和最大. 分析 考虑树形dp,dp[x]表示以x为子树 ...

随机推荐

  1. React组件间通信-sub/pub机制

    React生命周期第二个demo演示了兄弟组件的通信,需要通过父组件,比较麻烦:下面介绍sub/pub机制来事项组件间通信. 1.导包 npm i pubsub-js 2.UserSearch.jsx ...

  2. JavaScript实现 简易 堆

    有两个原始操作用于保证插入或删除节点以后堆是一个有效的最大堆或者最小堆: shiftUp(): 如果一个节点比它的父节点大(最大堆)或者小(最小堆),那么需要将它同父节点交换位置.这样是这个节点在数组 ...

  3. node中的crypto内置模块

    crypto模块的目的是为了提供通用的加密和哈希算法.用纯JavaScript代码实现这些功能不是不可能,但速度会非常慢.Nodejs用C/C++实现这些算法后,通过cypto这个模块暴露为JavaS ...

  4. mybatis 多级级联(多级嵌套)

    注:笔者这里的嵌套可以用词有点欠缺,忘见谅 需求:用一个查询接口查出其结果集,这里就用伪代码标识要返回前端的类与类之间的关系. class 顶层{ String otherValue; LinkedL ...

  5. nc浏览器的十宗罪

    1.收藏夹.nc浏览器收藏夹无法导出或者导出困难,十分恶心.其他的小众软件都有这个简单的功能,某天我突然想到为什么手机nc浏览器连个导出收藏夹的功能都没有,并不是不注重用户体验,或则导功能很难实现不会 ...

  6. OVS报错:s1.mgmt: version negotiation failed (we support version 0x01, peer supports version 0x04) ovs-ofctl: s1: failed to connect to socket (Broken pipe)

    mininet搭建拓扑后,查看流表,发现ovs命令报错 查找原因发现系mininet创建拓扑的命令使用了OpenFlow 1.3版本 ovs dump-flows命令默认是1.0版本,因此需要在ovs ...

  7. Alpha冲刺(6/6)

    队名:new game 组长博客:戳 作业博客:戳 组员情况 鲍子涵(队长) 燃尽图 过去两天完成了哪些任务 协调了一下组内的工作 复习了一下SuffixAutomata 接下来的计划 实现更多的功能 ...

  8. Telerik JustDecompile

    Free. For everyone. Forever. With an open source decompilation engine https://www.telerik.com/produc ...

  9. CentOS 上 Jenkins 的安装

    Jenkins 的前身是 Hudson. Jenkins 是一款开源 CI&CD 软件,用于自动化各种任务,包括构建.测试和部署软件. Jenkins 支持各种运行方式,可通过系统包.Dock ...

  10. nginx状态码

    200:服务器成功返回网页 403:服务器拒绝请求.404:请求的网页不存在 499:客户端主动断开了连接.500:服务器遇到错误,无法完成请求.502:服务器作为网关或代理,从上游服务器收到无效响应 ...