【树形DP】 HDU 2196 Computer
题意:求节点间的最大距离
先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相关推荐
- fwt优化+树形DP HDU 5909
1 //fwt优化+树形DP HDU 5909 2 //见官方题解 3 // BestCoder Round #88 http://bestcoder.hdu.edu.cn/ 4 5 #include ...
- HDU 2196 Computer 树形DP经典题
链接:http://acm.hdu.edu.cn/showproblem.php? pid=2196 题意:每一个电脑都用线连接到了还有一台电脑,连接用的线有一定的长度,最后把全部电脑连成了一棵树,问 ...
- HDU - 2196 Computer(树形dp)
题目链接:点击查看 题目大意:给定n个点以及n-1条边,保证可以组成一棵树,问每个点所能到达的最远距离 题目分析:首先这是一颗无向图所组成的树,经过分析,我们可以得到任何一个点,对于它所能到达的最远距 ...
- 树形DP(HDOJ1011 2196 4003 5148 POJ2342)
自己整理了个比较水的模版...一般简单的树形DP题基本可以解.... 用HDOJ 4003举例 题目大意:给一棵树,以及每人通过此边的花费,求用给定人数遍历树的最小花费 输入 点数,根位置,人数 始边 ...
- 树形DP——HDU 1011 Starship Troopers
HDU 1011 Starship Troopers 题目 http://acm.hdu.edu.cn/showproblem.php?pid=1011 作为星河战队的领导者,你被派去摧毁这些虫子的基 ...
- hdu 2196 computer
hdu 2196 题意 给出一棵树,求出树上每一个点在树上走一条简单路径所能走的最长距离. 解法 说起来,这是我今天1A的第一题 我们设 \(up[i]\) 表示从这个点向上走到某个点又向下走的最长距 ...
- Hdu 2196 - Computer
即求树上每点的最长路,先求出树的直径上的一点(dfs.bfs均可,寻找第一点我用的bfs),然后再从这点搜出树直径的另一点.可以证明每点的最长路是到这两点的距离之一(因为树是连通的,因为是树的直径,如 ...
- 树形DP --算法竞赛专题解析(17)
本系列文章将于2021年整理出版,书名<算法竞赛专题解析>. 前驱教材:<算法竞赛入门到进阶> 清华大学出版社 网购:京东 当当 想要一本作者签名书?点我 如有建议, ...
- 动态规划--树形DP
动态规划--树形DP 1.什么是树型动态规划 顾名思义,树型动态规划就是在"树"的数据结构上的动态规划,平时作的动态规划都是线性的或者是建立在图上的,线性的动态规划有二种方向既 ...
最新文章
- 语言 micropython_很多人用Python,但MicroPython是什么?
- livebos--流程节点判断
- Leetcode1700. 无法吃午餐的学生数量[C++题解]:模拟题简单,用queue
- java直线函数_java实现顺序结构线性列表的函数代码
- AIR 中 File 对象的几个系统文件夹及其属性.
- J - 青蛙的约会(扩展欧几里得)
- mongdb group聚合操作
- Selenium 与PhantomJS
- centos7+jexus5.8.3部署ASP.NET的MVC项目
- 居家隔离的第5天,我们整了个六边形战士
- ad15的stc元件库_STC系列单片机内部AD的应用
- 数据加密 第四篇:对称密钥
- 计算机网络基础练习题(附解析,考前必备)
- 惠普台式计算机怎么拆外壳,hp台式电脑cpu风扇怎么拆图解
- 01 计算机网络概念
- axure8屏幕滚动_Axure8原型教程:实现滚动效果(小技巧:隐藏滚动条)
- 关于开发板ping不通主机,360安全卫士阻拦
- 对未来人工智能的一些预测和想法
- 全网最详细 Opencv + OpenNi + 奥比中光(Orbbec) Astra Pro /乐视三合一体感摄像头LeTMC-520 + linux 环境搭建
- get请求和post请求的区别(简洁易懂)
热门文章
- wamp2.5可用php5.6,局域网访问,多站点配置
- 【转】代码里的命名规则:错误的和正确的对比
- VS2010 自动化整理代码(1)--- VS正则表达替换 PK Vim
- 非安装版的PostgreSQL8.3.3的首次使用经历
- traceroute命令的用法实例
- VS2008编译boost库
- mybatisplus 操作另一个数据库的数据_MySQL数据库的基础操作
- css 关闭按钮实现,CSS做的关闭按钮动效
- php 避免xss_PHP防止XSS注入
- java 批量验证_正则表达式批量验证函数