[HDU 2196] Computer 树形dp
来源:互联网 发布:淘宝运营常用软件 编辑:程序博客网 时间:2024/05/16 16:58
http://acm.hdu.edu.cn/showproblem.php?pid=2196
题意:开始输入 n ,表示有 n 个顶点,然后输入 n - 1 行,第 i 行两个数 x, y 表示 i, x有一条边, 路径长度为 y ,求每个点和离这个点距离最远的点之间的距离。
思路:用个数组dp[i][2]记录一下每个节点 i 的最远距离和次远距离。首先 dfs 一次,把每个点除父结点以外的的最远距离和次远距离求出来,然后再 dfs 一次把父结点方向的距离也加入到最远和次远距离中。
#include <cstdio>#include <vector>#include <cstring>#include <iostream>using namespace std;typedef long long loli;struct node{ int to; int val; node(int x = 0, int y = 0){ to = x; val = y; }};int n;loli dp[10010][2];vector<node> tr[10010];loli Dfs_1(int rt, int pre) //求每个点除父结点方向以外的最远距离和次远距离{ int len = tr[rt].size(); dp[rt][0] = dp[rt][1] = 0; for(int i = 0; i < len; i++){ int son = tr[rt][i].to; if(son == pre) continue; loli flag = Dfs_1(son, rt) + tr[rt][i].val; if(flag > dp[rt][0]){ //更新最远距离 dp[rt][1] = dp[rt][0]; //最远变次远 dp[rt][0] = flag; } else if(flag > dp[rt][1]){ //更新次远距离 dp[rt][1] = flag; } } return dp[rt][0];}int Dfs_2(int rt, int pre, loli sum) //sum 是父结点方向的最远距离{ int len = tr[rt].size(); if(sum > dp[rt][0]){ //更新最远距离 dp[rt][1] = dp[rt][0]; //最远变次远 dp[rt][0] = sum; } else if(sum > dp[rt][1]){ //更新次远距离 dp[rt][1] = sum; } for(int i = 0; i < len; i++){ int son = tr[rt][i].to; if(son == pre) continue; if(dp[son][0] + tr[rt][i].val == dp[rt][0]) //当前方向是最远距离 Dfs_2(son, rt, dp[rt][1] + tr[rt][i].val); //传递次远距离 else Dfs_2(son, rt, dp[rt][0] + tr[rt][i].val); //不是最远距离方向 }}int main(){ while(cin>>n){ int x, y; for(int i = 0; i <= n; i++){ tr[i].clear(); } for(int i = 2; i <= n; i++){ cin>>x>>y; tr[i].push_back(node(x, y)); tr[x].push_back(node(i, y)); } Dfs_1(1, -1); Dfs_2(1, -1, 0); for(int i = 1; i <= n; i++){ cout<<dp[i][0]<<endl; } } return 0;}
0 0
- HDU 2196 Computer(树形dp)
- 【树形DP】 HDU 2196 Computer
- HDU 2196 Computer(树形DP)
- Hdu 2196 Computer(树形dp)
- Computer - HDU 2196 树形dp
- Hdu 2196 Computer (树形dp)
- HDU 2196 Computer | 树形dp
- 【树形DP】 HDU 2196 Computer
- HDU 2196 Computer (树形DP)
- hdu 2196 Computer (树形dp)
- *HDU 2196 - Computer(树形DP)
- [HDU 2196] Computer 树形dp
- HDU 2196Computer 树形dp
- 【hdu】2196 Computer【树形dp】
- HDU 2196 Computer [树形dp]
- hdu 2196 Computer(树形DP)
- 树形DP-HDU-2196-Computer
- 【HDU】2196 Computer 树形dp
- 读《数学之美》第三章 统计语言模型
- The constructor SimpleAdapter(new View.OnClickListener(){},...)is undefined的问题及解决
- HDOJ 1222 Wolf and Rabbit(数学解题技巧)
- hdu 1372 Knight Moves(经典BFS)
- 简易相册
- [HDU 2196] Computer 树形dp
- hdu 1558:Segment set
- makefile
- 三目运算符的简单介绍
- 最小生成树 prim算法和kruskal
- STP 根桥、根端口、指定端口是如何选举的
- MIT6.828 JOS系统 lab2
- 湖南多校对抗赛(A - A)
- SQLServer 常用命令