HDU 2196 Computer 树形DP 经典题
给出一棵树,边有权值,求出离每一个节点最远的点的距离
树形DP,经典题
本来这道题是无根树,可以随意选择root,
但是根据输入数据的方式,选择root=1明显可以方便很多。
我们先把边权转化为点权,放在数组cost中
令tree(i)表示以节点i为根的子树
对于节点i,离该节点最远的点要不就是在tree(i)中,要不就是在father(i)上面
令:
dp[i][1] : 在子树tree(i)中,离i最远的距离
dp[i][2] : 在子树tree(i)中,离i第二远的距离 (递推的时候需要)
dp[i][0] : 在树tree(root)-tree(i)中,离i最远的距离
son[i] : 在子树tree(i)中,离i最远的点是在tree(son[i])中,即最远路径经过节点son[i]
则对于每一个i,离i最远的距离=max(dp[i][0],dp[i][1])
流程:
0.链式前向星建树
1.dfs1,确定dp[i][1]
2.dfs2,确定dp[i][2]
dfs1和dfs2都很简单
3.dfs3,递推确定dp[i][0]
- #include<cstdio>
- #include<cstring>
- using namespace std;
- const int maxn=+;
- const int inf=0x3f3f3f3f;
- inline int max(int a,int b)
- {
- return a>b?a:b;
- }
- struct Edge
- {
- int to,next;
- };
- Edge edge[maxn];
- int head[maxn];
- int tot;
- int cost[maxn];
- int son[maxn];
- int dp[maxn][];
- void init()
- {
- memset(head,-,sizeof head);
- tot=;
- memset(dp,,sizeof dp);
- memset(son,-,sizeof son);
- }
- void addedge(int u,int v)
- {
- edge[tot].to=v;
- edge[tot].next=head[u];
- head[u]=tot++;
- }
- void solve(int n);
- void dfs1(int u,int pre);
- void dfs2(int u,int pre);
- void dfs3(int u,int pre);
- int main()
- {
- int n;
- while(~scanf("%d",&n))
- {
- init();
- cost[]=;
- for(int i=;i<=n;i++)
- {
- int u;
- scanf("%d %d",&u,&cost[i]);
- addedge(u,i);
- }
- solve(n);
- }
- return ;
- }
- void solve(int n)
- {
- dfs1(,-);
- dfs2(,-);
- dp[][]=;
- dfs3(,-);
- for(int i=;i<=n;i++)
- {
- printf("%d\n",max(dp[i][],dp[i][]));
- }
- return ;
- }
- void dfs1(int u,int pre)
- {
- for(int i=head[u];~i;i=edge[i].next)
- {
- int v=edge[i].to;
- dfs1(v,u);
- if(dp[v][]+cost[v]>dp[u][])
- {
- dp[u][]=dp[v][]+cost[v];
- son[u]=v;
- }
- }
- }
- void dfs2(int u,int pre)
- {
- for(int i=head[u];~i;i=edge[i].next)
- {
- int v=edge[i].to;
- dfs2(v,u);
- if(v==son[u])
- continue;
- if(dp[v][]+cost[v]>dp[u][])
- dp[u][]=dp[v][]+cost[v];
- }
- }
- void dfs3(int u,int pre)
- {
- for(int i=head[u];~i;i=edge[i].next)
- {
- int v=edge[i].to;
- if(v==son[u])
- {
- dp[v][]=max(dp[u][],dp[u][])+cost[v];
- }
- else
- {
- dp[v][]=max(dp[u][],dp[u][])+cost[v];
- }
- dfs3(v,u);
- }
- }
HDU 2196 Computer 树形DP 经典题的更多相关文章
- HDU 2196 Computer 树形DP经典题
链接:http://acm.hdu.edu.cn/showproblem.php? pid=2196 题意:每一个电脑都用线连接到了还有一台电脑,连接用的线有一定的长度,最后把全部电脑连成了一棵树,问 ...
- hdu 2196 Computer 树形dp模板题
Computer Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total S ...
- hdu 2196 Computer(树形DP经典)
Computer Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Su ...
- HDU 2196.Computer 树形dp 树的直径
Computer Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Su ...
- hdu 2196 Computer(树形DP)
Computer Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Su ...
- 51nod 1353 树 | 树形DP经典题!
51nod 1353 树 | 树形DP好题! 题面 切断一棵树的任意条边,这棵树会变成一棵森林. 现要求森林中每棵树的节点个数不小于k,求有多少种切法. 数据范围:\(n \le 2000\). 题解 ...
- POJ 1155 TELE 背包型树形DP 经典题
由电视台,中转站,和用户的电视组成的体系刚好是一棵树 n个节点,编号分别为1~n,1是电视台中心,2~n-m是中转站,n-m+1~n是用户,1为root 现在节点1准备转播一场比赛,已知从一个节点传送 ...
- HDU 2196 Computer (树dp)
题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=2196 给你n个点,n-1条边,然后给你每条边的权值.输出每个点能对应其他点的最远距离是多少 ...
- HDU - 2196(树形DP)
题目: A school bought the first computer some time ago(so this computer's id is 1). During the recent ...
随机推荐
- C#中正则表达式的使用
目前为止,许多编程语言和工具都包含对正则表达式的支持,C#也不例外,C#基础类库中包含有一个命名空间(System.Text.RegularExpressions)和一系列可以充分发挥规则表达式威力的 ...
- createdb test时报global/pg_filenode.map不存在
实际上是存在的,看到说是ipv6占用了5432的端口号,看了一下的确是,将ipv6关闭重启系统即可. 下面是关闭ipv6的方法: 确认IPV6是否开启 在Linux下确认IPv6是否已经被启用,可以从 ...
- Oracle数据库——SQL高级查询
一.涉及内容 1.掌握SELECT语句的多表连接查询. 2.掌握SELECT语句的子查询. 二.具体操作 (一)根据Oracle数据库scott方案下的emp表和dept表,完成下列操作: 1.查询所 ...
- Openjudge计算概论-DNA排序
/*===================================== DNA排序 总时间限制: 1000ms 内存限制: 65536kB 描述 给出一系列基因序列,由A,C,G,T四种字符组 ...
- LINUX系统下PHP显示空白页
因为手工转移,文件所属用户及用户组是root,所以需要把网站程序及数据库都改成对应用户组:如www和mysql. 更改目录所属用户执行命令: chown -R 用户.用户组 目录名, 如:chown ...
- 百度ue富文本编辑器setContent方法报错初始化加载内容失败解决办法
解决方案: 不能创建editor之后马上使用ueditor.setContent('文本内容');要等到创建完成之后才可以使用 ueditor.addListener("ready" ...
- python exec
exec官方声明This statement supports dynamic execution of Python code. exec语句用来执行储存在字符串或文件中的python语句.exec ...
- ibats注意
<isNotEqual property="id" compareValue="0" prepend="and">id=#id# ...
- BI案例:KPI在商业智能中的应用(ZT)
KPI(Key Performance Indication)即关键业绩指标,是通过对组织内部某一流程的输入端.输出端的关键参数进行设置.取样.计算.分析,衡量流程绩效的一种目标式量化管理指标,是把企 ...
- Android 使用Telephony API
Android 使用Telephony API public class TelephonyDemo extends Activity { TextView textOut; TelephonyMan ...