SGU 149 Computer Network 树DP/求每个节点最远端长度
一个比较经典的题型,两次DFS求树上每个点的最远端距离。
参考这里:http://hi.baidu.com/oi_pkqs90/item/914e951c41e7d0ccbf904252
dp[i][0]表示最远端在以 i 为根的子树中的最长长度,dp[i][1]记录最远端在以i为根的子树中的次长长度,dp[i][2]表示最远端不在以 i 为根的子树中的最长长度。
答案即为max( dp[i][0], dp[i][2] );
dp[i][0]和dp[i][1]可以通过一次DFS得到。
再看dp[i][2], 设fa[i]为节点 i 的父节点: dp[i][2] = max( dp[ fa[i] ][2], dp[ fa[i] ][0] ) + dis[ fa[i] ][i];
显然,如果dp[ fa[i] ][0] 中的最长长度是由dp[i][0]状态转移得到的,上面的结论就不对了。
于是我们还需要记录dp[i][1]: 最远端在以i为根的子树中的次长长度。
假设best[i]表示:状态dp[i][0]是由状态dp[ best[i] ][0]转移得到,则:
if ( best[i] == fa[i] ) dp[i][2] = max( dp[ fa[i] ][2], dp[ fa[i] ][1] ) + dis[ fa[i] ][i];
else dp[i][2] = max( dp[ fa[i] ][2], dp[ fa[i] ][0] ) + dis[ fa[i] ][i];
因此还需要一次DFS求得dp[i][2], 答案即为max( dp[i][0], dp[i][2] );
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm> using namespace std; const int MAXN = ; struct node
{
int v;
int w;
int next;
}; int N, EdgeN;
int head[MAXN];
int best[MAXN];
int dp[MAXN][];
node D[ MAXN << ]; void AddEdge( int u, int v, int w )
{
D[EdgeN].v = v;
D[EdgeN].w = w;
D[EdgeN].next = head[u];
head[u] = EdgeN++;
return;
} void DFS1( int u )
{
for ( int i = head[u]; i != -; i = D[i].next )
{
int v = D[i].v;
int w = D[i].w;
DFS1(v);
if ( dp[v][] + w > dp[u][] )
{
dp[u][] = dp[u][];
dp[u][] = dp[v][] + w;
best[u] = v;
}
else if ( dp[v][] + w > dp[u][] )
dp[u][] = dp[v][] + w;
}
return;
} void DFS2( int u )
{
for ( int i = head[u]; i != -; i = D[i].next )
{
int fa = D[i].v;
int w = D[i].w;
dp[fa][] = dp[u][] + w;
if ( fa == best[u] )
dp[fa][] = max( dp[fa][], dp[u][] + w );
else dp[fa][] = max( dp[fa][], dp[u][] + w );
DFS2( fa );
}
return;
} int main()
{
while ( scanf( "%d", &N ) == )
{
EdgeN = ;
memset( head, -, sizeof(head) );
for ( int v = ; v <= N; ++v )
{
int u, w;
scanf( "%d%d", &u, &w );
AddEdge( u, v, w );
AddEdge( v, u, w );
} memset( dp, , sizeof(dp) );
DFS1();
DFS2(); for ( int i = ; i <= N; ++i )
printf( "%d\n", max( dp[i][], dp[i][] ) );
}
return ;
}
SGU 149 Computer Network 树DP/求每个节点最远端长度的更多相关文章
- SGU 149. Computer Network( 树形dp )
题目大意:给N个点,求每个点的与其他点距离最大值 很经典的树形dp...很久前就想写来着...看了陈老师的code才会的...mx[x][0], mx[x][1]分别表示x点子树里最长的2个距离, d ...
- SGU 149. Computer Network
时间限制:0.25s 空间限制:4M: 题意: 给出一颗n(n<=10000)个节点的树,和n-1条边的长度.求出这棵树每个节点到最远节点的距离: Solution: 对于一个节点,我们可以用D ...
- POJ 3659 Cell Phone Network (树dp)
题目链接:http://poj.org/problem?id=3659 给你一个树形图,一个点可以覆盖他周围连接的点,让你用最少的点覆盖所有的点. dp[i][0]表示用i点来覆盖,dp[i][1]表 ...
- codeforces GYM 100114 J. Computer Network 无相图缩点+树的直径
题目链接: http://codeforces.com/gym/100114 Description The computer network of “Plunder & Flee Inc.” ...
- codeforces GYM 100114 J. Computer Network tarjan 树的直径 缩点
J. Computer Network Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100114 Des ...
- [J]computer network tarjan边双联通分量+树的直径
https://odzkskevi.qnssl.com/b660f16d70db1969261cd8b11235ec99?v=1537580031 [2012-2013 ACM Central Reg ...
- [Codeforces 555E]Case of Computer Network(Tarjan求边-双连通分量+树上差分)
[Codeforces 555E]Case of Computer Network(Tarjan求边-双连通分量+树上差分) 题面 给出一个无向图,以及q条有向路径.问是否存在一种给边定向的方案,使得 ...
- [HDOJ2196]Computer (树直径, 树DP)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2196 给一棵树,求树上各点到某点的距离中最长的距离.注意每个点都要求. 和普通求树的直径不一样,要求每 ...
- (中等) CF 555E Case of Computer Network,双连通+树。
Andrewid the Android is a galaxy-known detective. Now he is preparing a defense against a possible a ...
随机推荐
- Java_Swing实现小球沿正弦曲线运动的代码
1 package zuidaimapack_1; import java.awt.*; import javax.swing.*; /** *Java_Swing实现小球沿正弦曲线运动的代码 * @ ...
- 【Validate Binary Search Tree】cpp
题目: Given a binary tree, determine if it is a valid binary search tree (BST). Assume a BST is define ...
- 【转载】Oracle实例和Oracle数据库(Oracle体系结构)
免责声明: 本文转自网络文章,转载此文章仅为个人收藏,分享知识,如有侵权,请联系博主进行删除. 原文作者:Leshami 原文地址:http://blog.csdn.net/ ...
- 【BZOJ】【3164】【HEOI2013】Eden的博弈问题
树形DP 这题在考场上直接写的TreeDP……当时也没想出一个像样的暴力来对拍……好像只能这么直接做了……? 都说是博弈树了,转移关系都给的这么直接了……也没啥难度了吧= =(怪不得大家都不愿意写题解 ...
- cf 61E. Enemy is weak 树状数组求逆序数(WA) 分类: Brush Mode 2014-10-19 15:16 104人阅读 评论(0) 收藏
#include <iostream> #include <algorithm> #include <cstdio> #include <cstring> ...
- LAMP一键安装包-CentOS 5/6下自动编译安装Apache,MySQL,PHP
http://www.centos.bz/lamp/ 此安装包已经不再维护,请使用新版http://www.centos.bz/ezhttp/. 适用环境: 系统支持:CentOS-5 (32bit/ ...
- C#简单windows服务
因为做后台比较多,所以经常需要写一些后台服务.一般的流程是先创建一个服务项目,加入代码.然后打包一个安装程序或者直接用dos命令安装服务.下面是详细内容: 1. 创建windows服务项目. ...
- websphere变成英文了
ebsphere页面怎么变成中文? 浏览器 -- internet选项 -- 常规 -- "语言" -- 打开后: 1. 如果只有"英语(美国)[en-US]" ...
- Python:Python 3.x 的革新
Python 3.x 版本在设计时为了向最好的语言前进,没有考虑向下兼容,许多针对早期 Python 版本设计的程序都无法正常运行.本文简单介绍了 Python 3.x 版本较之 2.x 版本语法上的 ...
- MariaDB集群Galera Cluster的研究与测试
MariaDB集群Galera Cluster的研究与测试 Galera Cluster是MariaDB的一个双活多主集群,其可以使得MariDB的所有节点保持同步,Galera为MariaDB提供了 ...