题意:求节点间的最大距离

先DFS一次 记录下 每一节点的子树下的最大距离(DP[ u ] [ 0 ])和第二大距离(DP[ u ] [ 1 ])

用DP[ v ] [ 2 ] 表示由v的父节点来的最大距离

再取DP[ u ] [ 0 ] 与 DP[ u ][ 2 ] 的最值

#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <string>
#include <iostream>
#include <algorithm>
#include <sstream>
#include <cmath>
using namespace std;
#include <queue>
#include <stack>
#include <vector>
#include <deque>
#include <set>
#include <map>
#include <time.h>;
#define cler(arr, val)    memset(arr, val, sizeof(arr))
#define FOR(i,a,b)  for(int i=a;i<=b;i++)
#define IN   freopen ("in.txt" , "r" , stdin);
#define OUT  freopen ("out.txt" , "w" , stdout);
typedef long long  LL;
const int MAXN = 10014;
const int MAXM = 20014;
const int INF = 0x3f3f3f3f;
const int mod = 1000000007;
struct node
{int v,next;LL val;
} edge[MAXM];
int head[MAXM],tol;
LL dp[MAXN][3];
bool vis[MAXN];
void init()
{cler(head,-1);tol=0;
}
void addedge(int u,int v,LL val)
{edge[tol].v=v,edge[tol].val=val,edge[tol].next=head[u];head[u]=tol++;edge[tol].v=u,edge[tol].val=val,edge[tol].next=head[v];head[v]=tol++;
}
void dfs1(int u)
{if(vis[u]) return ;vis[u]=true;for(int i=head[u]; ~i; i=edge[i].next){int v=edge[i].v;if(!vis[v]){dfs1(v);dp[u][1]=max(dp[u][1],dp[v][0]+edge[i].val);if(dp[u][1]>dp[u][0])swap(dp[u][1],dp[u][0]);}}
}
void dfs2(int u)
{if(vis[u]) return ;vis[u]=true;for(int i=head[u]; ~i; i=edge[i].next){int v=edge[i].v,val=edge[i].val;if(!vis[v]){if(dp[u][0]>dp[v][0]+val)//dp[u][0]不是由dp[v][0]+val而来的dp[v][2]=max(dp[v][2],max(dp[u][0]+val,dp[u][2]+val));//所以从非v子树来的更长else //dp[u][0]由dp[v][0]+val而来的dp[v][2]=max(dp[v][2],max(dp[u][1]+val,dp[u][2]+val));//推断非v子树来的哪个长dfs2(v);}}
}
int main()
{
#ifndef ONLINE_JUDGEfreopen("in.txt", "r", stdin);
#endifint n;while(~scanf("%d",&n)){init();for(int i=2; i<=n; i++){int a;LL b;scanf("%d %I64d",&a ,&b );addedge(i,a,b);}cler(vis,false);cler(dp,0);dfs1(1);cler(vis,false);dfs2(1);for(int i=1;i<=n;i++)printf("%I64d\n",max(dp[i][2],dp[i][0]));}}

转载于:https://www.cnblogs.com/gccbuaa/p/7091545.html

【树形DP】 HDU 2196 Computer相关推荐

  1. fwt优化+树形DP HDU 5909

    1 //fwt优化+树形DP HDU 5909 2 //见官方题解 3 // BestCoder Round #88 http://bestcoder.hdu.edu.cn/ 4 5 #include ...

  2. HDU 2196 Computer 树形DP经典题

    链接:http://acm.hdu.edu.cn/showproblem.php? pid=2196 题意:每一个电脑都用线连接到了还有一台电脑,连接用的线有一定的长度,最后把全部电脑连成了一棵树,问 ...

  3. HDU - 2196 Computer(树形dp)

    题目链接:点击查看 题目大意:给定n个点以及n-1条边,保证可以组成一棵树,问每个点所能到达的最远距离 题目分析:首先这是一颗无向图所组成的树,经过分析,我们可以得到任何一个点,对于它所能到达的最远距 ...

  4. 树形DP(HDOJ1011 2196 4003 5148 POJ2342)

    自己整理了个比较水的模版...一般简单的树形DP题基本可以解.... 用HDOJ 4003举例 题目大意:给一棵树,以及每人通过此边的花费,求用给定人数遍历树的最小花费 输入 点数,根位置,人数 始边 ...

  5. 树形DP——HDU 1011 Starship Troopers

    HDU 1011 Starship Troopers 题目 http://acm.hdu.edu.cn/showproblem.php?pid=1011 作为星河战队的领导者,你被派去摧毁这些虫子的基 ...

  6. hdu 2196 computer

    hdu 2196 题意 给出一棵树,求出树上每一个点在树上走一条简单路径所能走的最长距离. 解法 说起来,这是我今天1A的第一题 我们设 \(up[i]\) 表示从这个点向上走到某个点又向下走的最长距 ...

  7. Hdu 2196 - Computer

    即求树上每点的最长路,先求出树的直径上的一点(dfs.bfs均可,寻找第一点我用的bfs),然后再从这点搜出树直径的另一点.可以证明每点的最长路是到这两点的距离之一(因为树是连通的,因为是树的直径,如 ...

  8. 树形DP --算法竞赛专题解析(17)

    本系列文章将于2021年整理出版,书名<算法竞赛专题解析>. 前驱教材:<算法竞赛入门到进阶> 清华大学出版社 网购:京东 当当      想要一本作者签名书?点我 如有建议, ...

  9. 动态规划--树形DP

    动态规划--树形DP  1.什么是树型动态规划  顾名思义,树型动态规划就是在"树"的数据结构上的动态规划,平时作的动态规划都是线性的或者是建立在图上的,线性的动态规划有二种方向既 ...

最新文章

  1. 语言 micropython_很多人用Python,但MicroPython是什么?
  2. livebos--流程节点判断
  3. Leetcode1700. 无法吃午餐的学生数量[C++题解]:模拟题简单,用queue
  4. java直线函数_java实现顺序结构线性列表的函数代码
  5. AIR 中 File 对象的几个系统文件夹及其属性.
  6. J - 青蛙的约会(扩展欧几里得)
  7. mongdb group聚合操作
  8. Selenium 与PhantomJS
  9. centos7+jexus5.8.3部署ASP.NET的MVC项目
  10. 居家隔离的第5天,我们整了个六边形战士
  11. ad15的stc元件库_STC系列单片机内部AD的应用
  12. 数据加密 第四篇:对称密钥
  13. 计算机网络基础练习题(附解析,考前必备)
  14. 惠普台式计算机怎么拆外壳,hp台式电脑cpu风扇怎么拆图解
  15. 01 计算机网络概念
  16. axure8屏幕滚动_Axure8原型教程:实现滚动效果(小技巧:隐藏滚动条)
  17. 关于开发板ping不通主机,360安全卫士阻拦
  18. 对未来人工智能的一些预测和想法
  19. 全网最详细 Opencv + OpenNi + 奥比中光(Orbbec) Astra Pro /乐视三合一体感摄像头LeTMC-520 + linux 环境搭建
  20. get请求和post请求的区别(简洁易懂)

热门文章

  1. wamp2.5可用php5.6,局域网访问,多站点配置
  2. 【转】代码里的命名规则:错误的和正确的对比
  3. VS2010 自动化整理代码(1)--- VS正则表达替换 PK Vim
  4. 非安装版的PostgreSQL8.3.3的首次使用经历
  5. traceroute命令的用法实例
  6. VS2008编译boost库
  7. mybatisplus 操作另一个数据库的数据_MySQL数据库的基础操作
  8. css 关闭按钮实现,CSS做的关闭按钮动效
  9. php 避免xss_PHP防止XSS注入
  10. java 批量验证_正则表达式批量验证函数