博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【树形DP】【P1364】医院放置
阅读量:6799 次
发布时间:2019-06-26

本文共 1205 字,大约阅读时间需要 4 分钟。

Description

  

  设有一棵二叉树,如图:

   

  其中,圈中的数字表示结点中居民的人口。圈边上数字表示结点编号,现在要求在某个结点上建立一个医院,使所有居民所走的路程之和为最小,同时约定,相邻接点之间的距离为1。如上图中,

  若医院建在1 处,则距离和=4+12+2*20+2*40=136;若医院建在3 处,则距离和=4*2+13+20+40=81……

 

Input  

  第一行一个整数n,表示树的结点数。

  接下来的n行每行描述了一个结点的状况,包含三个整数,整数之间用空格(一个或多个)分隔,其中:第一个数为居民人口数;第二个数为左链接,为0表示无链接;第三个数为右链接。

Output

  一个整数,表示最小距离和。

Sample Input

5                        13 2 34 0 012 4 520 0 040 0 0

Sample Output

81

Hint

  n≤100

Solution

  事实上这是一道非常简单的全员最短路,直接floyd就能够AC,但是冲着DP的标签,有一种树形DP的方法,在常规的树形DP中,由儿子更新父亲的信息,但在本题中,需要预处理根节点的信息,然后通过父亲更新儿子。复杂度O(n)。

  记f[i]为在i点放医院的答案,sz[i]为以i为根的子树的节点权值和,手动画图可推知,f[son]=f[fa]+(sz[1]-sz[to])-sz[to]=f[fa]+sz[1]-2*sz[to]。预处理f[1],dfs更新子树即可

Code

#include
#define maxn 105inline void qr(int &x) { char ch=getchar();int f=1; while(ch>'9'||ch<'0') { if(ch=='-') f=-1; ch=getchar(); } while(ch>='0'&&ch<='9') x=(x<<1)+(x<<3)+(ch^48),ch=getchar(); x*=f;}inline int max(int a,int b) {
return a>b?a:b;}inline int min(int a,int b) {
return a

Summary

  1、对于一般的树形DP,其状态设计一般为“以i为根的子树……”,通过儿子更新父亲。但是有一些特殊的DP形式,需要通过父亲更新儿子,f[i]表示“在i点……”。

  2、对于树上的题,可以优先思考图论问题,然后再思考DP,有些题使用图论可以轻松解决。

转载于:https://www.cnblogs.com/yifusuyi/p/9160674.html

你可能感兴趣的文章
「镁客·请讲」前知智能唐宝:中国金属3D打印最大的挑战是软硬件的自研与国产化 ...
查看>>
EMNLP2018 - 语言理解+对话系统的最新进展
查看>>
如何解决移动电商平台中的“伪曝光”?
查看>>
迁云工具版本更新(1.3.2.5)
查看>>
使用golang编写prometheus metrics exporter
查看>>
基于python开发的股市行情看板
查看>>
linux进程管理总结
查看>>
Linux学习笔记(1)--基本命令
查看>>
Longhorn:实现Kubernetes集群的持久化存储
查看>>
阿里云 Aliplayer高级功能介绍(三):多字幕
查看>>
Data Lake Analytics: 以SQL方式查询Redis数据
查看>>
一条查询sql的执行流程和底层原理
查看>>
ActiveMQ多个消费者消费不均匀问题
查看>>
ovirt自承载引擎安装配置 安装过程中的FQDN问题
查看>>
小米进军欧洲智能手机市场:一面是狂欢,一面是考验
查看>>
提高IO性能(只需要设置 noatime)
查看>>
批处理 启动和关闭 Oracle 11g 服务
查看>>
二手车服务商完成A轮融资,投资方为标志雪铁龙集团
查看>>
一文读懂什么是Java中的自动拆装箱
查看>>
java函数式编程
查看>>