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 ...
随机推荐
- 类模板的困扰 LNK2019 (转)
原文地址:http://www.eetop.cn/blog/html/93/493893-14903.html 在使用类模板技术时,可在.h中实现,也可在.h和.cpp中分开实现,若用.h实现,不要在 ...
- poj 1325 Machine Schedule 最小点覆盖
题目链接:http://poj.org/problem?id=1325 As we all know, machine scheduling is a very classical problem i ...
- java数组与内存控制
1.1数组的初始化 数组是大多数编程语言都提供一种的复合结构,如果程序需要多个类型相同的变量时,就可以考虑定义一个数组.java语言的数组变量时引用类型的变量,因此具有java独有的特性. java数 ...
- 引擎设计跟踪(九.14.2a) 导出插件问题修复和 Tangent Space 裂缝修复
由于工作很忙, 近半年的业余时间没空搞了, 不过工作马上忙完了, 趁十一有时间修了一些小问题. 这次更新跟骨骼动画无关, 修复了一个之前的, 关于tangent space裂缝的问题: 引擎设计跟踪( ...
- 常用的CSSreset整理
说道CSSreset,大家又爱又恨,cssreset好处是,覆盖了浏览器的默认样式,使前端攻城狮能更加精确的添加样式,各个浏览器中的界面效果都相同.可是大量的.固定的CSSreset也给网页加载带来一 ...
- Java读取图片并修改像素,创建图片
public void replaceImageColor(String file, Color srcColor, Color targetColor) throws IOException{ UR ...
- BZOJ2463: [中山市选2009]谁能赢呢?
感慨下汉堡的找水题能力… /************************************************************** Problem: 2463 User: zhu ...
- Android 中多点触摸协议
http://blog.csdn.net/zuosifengli/article/details/7398661 Android 中多点触摸协议: 参考: http://www.kernel.org/ ...
- codeforces 439C Devu and Partitioning of the Array(烦死人的多情况的模拟)
题目 //这是一道有n多情况的烦死人的让我错了n遍的模拟题 #include<iostream> #include<algorithm> #include<stdio.h ...
- OpenCV4Android开发之旅(一)----OpenCV2.4简介及 app通过Java接口调用OpenCV的示例
转自: http://blog.csdn.net/yanzi1225627/article/details/16917961 开发环境:windows+ADT Bundle+CDT+OpenCV-2 ...