HDU 2196 Computer 树形DP经典题
链接:http://acm.hdu.edu.cn/showproblem.php?
pid=2196
题意:每一个电脑都用线连接到了还有一台电脑,连接用的线有一定的长度,最后把全部电脑连成了一棵树,问每台电脑和其它电脑的最远距离是多少。
思路:这是一道树形DP的经典题目。须要两次DFS,第一次DFS找到树上全部的节点在不同子树中的最远距离和次远的距离(在递归中进行动态规划就可以),第二次DFS从根向下更新出终于答案。对于每次更新到的节点u,他的最远距离可能是来自u的子树,或者是u的父亲节点的最远距离。假设u的父亲节点的最远距离是在第一次DFS过程中更新自u的话,那么u的最远距离就不能更新自u的父亲节点的最远节点,而是有可能更新自u的父亲节点的次远距离,这就是每次更新时要记录节点的次远距离的原因。
代码:
#include <algorithm>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <ctype.h>
#include <iostream>
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <string>
#include <vector>
#define eps 1e-8
#define INF 0x7fffffff
#define maxn 10005
#define PI acos(-1.0)
#define seed 31//131,1313
typedef long long LL;
typedef unsigned long long ULL;
using namespace std;
int dp[maxn][2],from[maxn],head[maxn],top;
void init()
{memset(head,-1,sizeof(head));memset(dp,0,sizeof(dp));top=0;
}
struct Edge
{int v,w;int next;
} edge[maxn*2];
void add_edge(int u,int v,int w)
{edge[top].v=v;edge[top].w=w;edge[top].next=head[u];head[u]=top++;
}
void dfs_first(int u,int f)
{from[u]=u;for(int i=head[u]; i!=-1; i=edge[i].next){int v=edge[i].v,w=edge[i].w;if(v==f)continue;dfs_first(v,u);if(dp[v][0]+w>dp[u][0]){from[u]=v;dp[u][1]=dp[u][0];dp[u][0]=dp[v][0]+w;}else if(dp[v][0]+w>dp[u][1])dp[u][1]=dp[v][0]+w;}
}
void dfs_second(int u,int f,int k)
{if(u!=f)if(from[f]!=u){if(dp[f][0]+k>dp[u][0]){from[u]=f;dp[u][1]=dp[u][0];dp[u][0]=dp[f][0]+k;}else if(dp[f][0]+k>dp[u][1])dp[u][1]=dp[f][0]+k;}else{if(dp[f][1]+k>dp[u][0]){from[u]=f;dp[u][1]=dp[u][0];dp[u][0]=dp[f][1]+k;}else if(dp[f][1]+k>dp[u][1])dp[u][1]=dp[f][1]+k;}for(int i=head[u]; i!=-1; i=edge[i].next){int v=edge[i].v,w=edge[i].w;if(v==f)continue;dfs_second(v,u,w);}
}
int main()
{int T,v,w;while(~scanf("%d",&T)){init();for(int i=2; i<=T; i++){scanf("%d%d",&v,&w);add_edge(v,i,w);add_edge(i,v,w);}dfs_first(1,1);dfs_second(1,1,0);for(int i=1;i<=T;i++)printf("%d\n",dp[i][0]);}return 0;
}
转载于:https://www.cnblogs.com/clnchanpin/p/7082650.html
HDU 2196 Computer 树形DP经典题相关推荐
- HDU - 2196 Computer(树形dp)
题目链接:点击查看 题目大意:给定n个点以及n-1条边,保证可以组成一棵树,问每个点所能到达的最远距离 题目分析:首先这是一颗无向图所组成的树,经过分析,我们可以得到任何一个点,对于它所能到达的最远距 ...
- POJ 1155 TELE 背包型树形DP 经典题
由电视台,中转站,和用户的电视组成的体系刚好是一棵树 n个节点,编号分别为1~n,1是电视台中心,2~n-m是中转站,n-m+1~n是用户,1为root 现在节点1准备转播一场比赛,已知从一个节点传送 ...
- HDU - 2196(树形DP)
题目: A school bought the first computer some time ago(so this computer's id is 1). During the recent ...
- hdu_Anniversary party_(树形DP入门题)
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1520 题意:有N个人,N-1个人有自己的上司,每个人有一个快乐值,如果这个人参加了聚会,那么这个人的直 ...
- HDU Starship Troopers (树形DP)
Starship Troopers Time Limit : 10000/5000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other) ...
- 洛谷P1352 没有上司的舞会(树形DP水题)
题目描述 某大学有N个职员,编号为1~N.他们之间有从属关系,也就是说他们的关系就像一棵以校长为根的树,父结点就是子结点的直接上司.现在有个周年庆宴会,宴会每邀请来一个职员都会增加一定的快乐指数Ri, ...
- HDU - 5242 Game(树形dp+树链剖分/树上贪心+思维)
题目链接:点击查看 题目大意:给出一棵包含n个节点的树,每个节点都有一个权值,整棵树的根是点1,问从点1开始向下一直走到叶子节点,可以走k次,怎么样走权值和最大,每个节点被走过一次后权值会变为0 题目 ...
- HDU 4616 Game 树形DP
Problem Description Nowadays, there are more and more challenge game on TV such as 'Girls, Rush Ahea ...
- hdu 2196 computer
hdu 2196 题意 给出一棵树,求出树上每一个点在树上走一条简单路径所能走的最长距离. 解法 说起来,这是我今天1A的第一题 我们设 \(up[i]\) 表示从这个点向上走到某个点又向下走的最长距 ...
最新文章
- 安卓打开rpm文件_微信文件如何分享到QQ?教你一招,不管什么手机都能行
- linux ssh 登陆后欢迎界面 banner 设置
- 五大常用算法之五:分支限界法
- 思科路由器IKEV2 L2L***预共享密码认证最简化配置
- “王者对战”之 MySQL 8 vs PostgreSQL 10
- 50: 加密与解密 、 AIDE入侵检测系统 、 扫描与抓包 、 总结和答疑
- 数字地球各类贴图资源下载地址
- 变电站红外图像数据集
- 信道编码技术——卷积码编码与译码
- scp收容失效找不到服务器,迟来的游戏更新——scp-收容失效高清重制版
- 无限循环滚动代码阿里巴巴国际站店铺装修代码底图滚动黑色半透明显示效果自定义内容装修代码全屏显示
- 基于SSH框架的电影订票系统网站的设计与实现
- 超级电容-一阶RC模型-RLS参数辨识-Simulink仿真
- abr-summary 和asbr-summary命令中的not-advertise参数
- 美赛BOOM数学建模1-2蒙特卡洛法
- hdu5594 ZYB's Prime
- Mega RAID卡创建步骤
- 联邦学习实战-1:用python从零开始实现横向联邦学习
- LabVIEW的第三方驱动(I/O接口设备)
- 想进世界顶尖投行 那我该上什么样的学校?