传送门

Description

  

  设有一棵二叉树,如图:

   

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

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

Input  

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

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

Output

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

Sample Input


Sample Output


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<cstdio>
#define maxn 105 inline void qr(int &x) {
char ch=getchar();int f=;
while(ch>''||ch<'') {
if(ch=='-') f=-;
ch=getchar();
}
while(ch>=''&&ch<='') x=(x<<)+(x<<)+(ch^),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<b?a:b;}
inline int abs(int x) {return x<?-x:x;} inline void swap(int &a,int &b) {
int c=a;a=b;b=c;
} struct Edge {
int to,nxt;
};
Edge edge[maxn];int hd[maxn],ecnt;
inline void cont(int from,int to) {
edge[++ecnt].to=to;
edge[ecnt].nxt=hd[from];
hd[from]=ecnt;
} int n,num[maxn],a,sz[maxn],frog[maxn],deepth[maxn],ans; void dfs(int fa,int k) {
deepth[k]=deepth[fa]+;sz[k]=num[k];
if(!hd[k]) return;
for(int i=hd[k];i;i=edge[i].nxt) {
dfs(k,edge[i].to);
sz[k]+=sz[edge[i].to];
}
} void search(int k) {
for(int i=hd[k];i;i=edge[i].nxt) {
int &to=edge[i].to;
frog[to]=frog[k]+sz[]-*sz[to];
search(to);
}
ans=min(ans,frog[k]);
} int main() {
qr(n);
for(int i=;i<=n;++i) {
qr(num[i]);
a=;qr(a);
if(a) cont(i,a);
a=;qr(a);
if(a) cont(i,a);
}
deepth[]=-;
dfs(,);
for(int i=;i<=n;++i) frog[]+=num[i]*deepth[i];
ans=frog[];
search();
printf("%d\n",ans);
return ;
}

Summary

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

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

【树形DP】【P1364】医院放置的更多相关文章

  1. BZOJ 2314: 士兵的放置( 树形dp )

    树形dp... dp(x, 0)表示结点x不放士兵, 由父亲控制: dp(x, 1)表示结点x不放士兵, 由儿子控制: dp(x, 2)表示结点x放士兵. ---------------------- ...

  2. 【BZOJ2314】士兵的放置 树形DP

    [BZOJ2314]士兵的放置 Description 八中有N个房间和N-1双向通道,任意两个房间均可到达.现在出了一件极BT的事,就是八中开始闹鬼了.老大决定加强安保,现在如果在某个房间中放一个士 ...

  3. 『战略游戏 最大利润 树形DP』

    通过两道简单的例题,我们来重新认识树形DP. 战略游戏(luoguP1026) Description Bob喜欢玩电脑游戏,特别是战略游戏.但是他经常无法找到快速玩过游戏的办法.现在他有个问题.他要 ...

  4. 树形dp 入门

    今天学了树形dp,发现树形dp就是入门难一些,于是好心的我便立志要发一篇树形dp入门的博客了. 树形dp的概念什么的,相信大家都已经明白,这里就不再多说.直接上例题. 一.常规树形DP P1352 没 ...

  5. 【BZOJ2616】SPOJ PERIODNI 笛卡尔树+树形DP

    [BZOJ2616]SPOJ PERIODNI Description Input 第1行包括两个正整数N,K,表示了棋盘的列数和放的车数. 第2行包含N个正整数,表示了棋盘每列的高度. Output ...

  6. [洛谷P2016] 战略游戏 (树形dp)

    战略游戏 题目描述 Bob喜欢玩电脑游戏,特别是战略游戏.但是他经常无法找到快速玩过游戏的办法.现在他有个问题. 他要建立一个古城堡,城堡中的路形成一棵树.他要在这棵树的结点上放置最少数目的士兵,使得 ...

  7. 树形DP小结

    树形DP1.简介:树是一种数据结构,因为树具有良好的子结构,而恰好DP是从最优子问题更新而来,那么在树上做DP操作就是从树的根节点开始深搜(也就是记忆化搜索),保存每一步的最优结果.tips:树的遍历 ...

  8. 初涉树形dp

    算是一个……复习以及进阶? 什么是树形dp 树形dp是一种奇妙的dp…… 它的一个重要拓展是和各种树形的数据结构结合,比如说在trie上.自动机上的dp. 而且有些时候还可以拓展到环加外向树.仙人掌上 ...

  9. P2016 战略游戏 (树形DP)

    题目描述 Bob喜欢玩电脑游戏,特别是战略游戏.但是他经常无法找到快速玩过游戏的办法.现在他有个问题. 他要建立一个古城堡,城堡中的路形成一棵树.他要在这棵树的结点上放置最少数目的士兵,使得这些士兵能 ...

随机推荐

  1. HTMLTestRunner.py(Python3)

    """A TestRunner for use with the Python unit testing framework. Itgenerates a HTML re ...

  2. 统计hive库表在具体下所有分区大小

    1 查询具体表分区大小,以字节展示 hadoop fs -du /user/hive/warehouse/treasury.db/dm_user_excercise > dm_user_exce ...

  3. hello word!------为什么开通博客以及自我介绍

    来北京已经一年半的日子了,已经完全成功熟练的成为了另一个我,没有了半年前刚来时的那种焦虑.急躁和格格不入. 回想起来那段时间,大概是我人生中非常重要的时期了,去年那个夏天,只身一人背上行囊踏上了北上的 ...

  4. 同台服务器 部署多个tomcat 需要做的修改

    需要修改以下加粗部分: 1:访问端口 8080->8081 2:shutdown 端口 8005->8015 3: AJP端口 8001->8010 <?xml version ...

  5. HADOOP-输出数据实体类承载

    新建一个bean包: 1.实现Writerable 2.有一个空的构造方法 代码实现: import java.io.DataInput; import java.io.DataOutput; imp ...

  6. [Clr via C#读书笔记]Cp7常量和字段

    Cp7常量和字段 常量 常量在编译的时候必须确定,只能一编译器认定的基元类型.被视为静态,不需要static:直接嵌入IL中: 区别ReadOnly 只能在构造的时候初始化,内联初始化. 字段 数据成 ...

  7. oracle数据库之存储函数和过程

    一.引言     ORACLE 提供可以把 PL/SQL 程序存储在数据库中,并可以在任何地方来运行它.这样就叫存储过程或函数.过程和函数统称为 PL/SQL 子程序,他们是被命名的 PL/SQL 块 ...

  8. SOA架构的理解

    实践论认为:从实践提升到理论,再由理论指导实践,由此向前发展.目前SOA的发展的情况………… 通过不少实践,SOA的模型己经被公认为标准规范,目前是正需要进一步总结上升到理论的时候了. SOA架构的演 ...

  9. PCA算法理解及代码实现

    github:PCA代码实现.PCA应用 本文算法均使用python3实现 1. 数据降维   在实际生产生活中,我们所获得的数据集在特征上往往具有很高的维度,对高维度的数据进行处理时消耗的时间很大, ...

  10. Debian 7 amd64--TP-LINK TL-WN725N 2.0源码驱动编译安装

    租房用的是无线网络,在新安装的Debian 7 amd64使用的无线网卡型号是TP-LINK TL-WN725N 2.0,发现驱动安装还是有些问题,折腾了很久,特意在此记录一下. TL-WN725N ...