【BZOJ1812】riv(多叉树转二叉树,树形DP)
题意:给定一棵树,每个点有权值,每条边有边权(单向边)。你可以选取K个黑点,使得从每个点移动到距离他最近的黑点的花费(距离*点权)的总和最小。
n<=100 k<=50 w[i],a[i]<=10000
思路:见IOI2005龙凡解题报告
为什么要多叉转二叉?因为假设点U被选,这个被选点只会对U自己的儿子有影响,对U的兄弟并没有影响
dp[i,j,k]表示以i为根的子树,建j个节点,离i最近的被选点是k时的最小总和
\[ dp[i,j,k]=min\begin{cases} dp[l[i],t,k]+dp[r[i],j-t,k]+(dis[i]-dis[k])*a[i]\\dp[l[i],t,i]+dp[r[i],j-t-1,k] \end{cases} \]
var dp:array[..,..,..]of longint;
head,vet,next,len,l,r,tree,a,dis:array[..]of longint;
n,m,i,x,y,tot:longint; procedure add(a,b,c:longint);
begin
inc(tot);
next[tot]:=head[a];
vet[tot]:=b;
len[tot]:=c;
head[a]:=tot;
end; procedure dfs(u:longint);
var e,v:longint;
begin
e:=head[u];
while e<> do
begin
v:=vet[e];
dis[v]:=dis[u]+len[e];
dfs(v);
e:=next[e];
end;
end; function min(x,y:longint):longint;
begin
if x<y then exit(x);
exit(y);
end; function ask(u,i,k:longint):longint;
var ans,j:longint;
begin
if dp[u,i,k]<maxlongint div then exit(dp[u,i,k]);
dp[u,i,k]:=maxlongint div ;
for j:= to i do
begin
ans:=;
if l[u]> then ans:=ans+ask(l[u],j,k);
if r[u]> then ans:=ans+ask(r[u],i-j,k);
dp[u,i,k]:=min(dp[u,i,k],ans+(dis[u]-dis[k])*a[u]);
if i-j->= then
begin
ans:=;
if l[u]> then ans:=ans+ask(l[u],j,u);
if r[u]> then ans:=ans+ask(r[u],i-j-,k);
dp[u,i,k]:=min(dp[u,i,k],ans);
end;
end;
//writeln(u-,' ',i,' ',k-);
exit(dp[u,i,k]);
end; begin
assign(input,'bzoj1812.in'); reset(input);
assign(output,'bzoj1812.out'); rewrite(output);
readln(n,m);
inc(n);
for i:= to n do
begin
read(a[i],x,y);
inc(x);
if tree[x]= then begin l[x]:=i; tree[x]:=i; end
else begin r[tree[x]]:=i; tree[x]:=i; end;
add(x,i,y);
end;
dfs();
fillchar(dp,sizeof(dp),$7f);
writeln(ask(,m,));
close(input);
close(output);
end.
【BZOJ1812】riv(多叉树转二叉树,树形DP)的更多相关文章
- 【BZOJ-1864】三色二叉树 树形DP
1864: [Zjoi2006]三色二叉树 Time Limit: 1 Sec Memory Limit: 64 MBSubmit: 659 Solved: 469[Submit][Status] ...
- 【BZOJ1864】[Zjoi2006]三色二叉树 树形DP
1864: [Zjoi2006]三色二叉树 Description Input 仅有一行,不超过500000个字符,表示一个二叉树序列. Output 输出文件也只有一行,包含两个数,依次表示最多和最 ...
- [luogu2585 ZJOI2006] 三色二叉树 (树形dp)
传送门 Description Input 输入文件名:TRO.IN 输入文件仅有一行,不超过500000个字符,表示一个二叉树序列. Output 输出文件名:TRO.OUT 输出文件也只有一行,包 ...
- [程序员代码面试指南]二叉树问题-找到二叉树中的最大搜索二叉树(树形dp)
题意 给定一颗二叉树的头节点,已知所有节点的值都不一样,找到含有节点最多的搜索二叉子树,并返回这个树的头节点. 题解 在后序遍历过程中实现. 求解步骤按树形dp中所列步骤.可能性三种:左子树最大.右子 ...
- 洛谷 P2585 [ ZJOI 2006 ] 三色二叉树 —— 树形DP
题目:https://www.luogu.org/problemnew/show/P2585 首先,三色其实记录两种状态:是绿色,不是绿色 即可,因为红蓝可以随意取反: 一开始因为懒得还原出树,所以写 ...
- BZOJ1864[ZJOI2006]三色二叉树[树形DP]
1864: [Zjoi2006]三色二叉树 Time Limit: 1 Sec Memory Limit: 64 MBSubmit: 773 Solved: 548[Submit][Status] ...
- 三色二叉树——树形dp
三色二叉树 题目描述 一棵二叉树可以按照如下规则表示成一个由 \(0.1.2\) 组成的字符序列,我们称之为"二叉树序列 \(S\) ": \(0\) 该树没有子节点. \(1S_ ...
- BZOJ 1864: [Zjoi2006]三色二叉树( 树形dp )
难得的ZJOI水题...DFS一遍就行了... ----------------------------------------------------------------------- #inc ...
- 洛谷 2585 [ZJOI2006]三色二叉树——树形dp
题目:https://www.luogu.org/problemnew/show/P2585 可以把不是绿色的记成一种.仔细一想不会有冲突.如果自己是绿色,孩子的不同颜色不会冲突:如果自己不是绿色,自 ...
- BZOJ 1864: [Zjoi2006]三色二叉树 树形DP + 读入
Description Input 仅有一行,不超过500000个字符,表示一个二叉树序列. Output 输出文件也只有一行,包含两个数,依次表示最多和最少有多少个点能够被染成绿色. 题解:本题大水 ...
随机推荐
- UVA1583 最小生成元
题很简单,主要是懂题意. 思想是枚举. #include<cstdio> #include<cstring> #define Max 100001 int ans[Max]; ...
- Ioc正解
IoC是一种模式 IoC(Inversion of Control)中文译为控制反转,目前Java社群中流行的各种轻量级容器的实现都是以IoC模式作为基础的.控制反转意味着在系统开发过程中,设计的类将 ...
- Pandas中DateFrame修改列名
Pandas中DateFrame修改列名 在做数据挖掘的时候,想改一个DataFrame的column名称,所以就查了一下,总结如下: 数据如下: >>>import pandas ...
- 代码中特殊的注释技术——TODO、FIXME和XXX的用处
前言:今天在阅读Qt Creator的源代码时,发现一些注释中有FIXME英文单词,用英文词典居然查不到其意义!实际上,在阅读一些开源代码时,我们常会碰到诸如:TODO.FIXME和XXX的单词,它 ...
- .net中常用的几种页面间传递参数的方法
转自:http://www.cnblogs.com/lxshanye/archive/2013/04/11/3014207.html 参考:http://www.cnblogs.com/zhangka ...
- .Net操作Excel
先去官网:http://npoi.codeplex.com/下载需要引入dll(可以选择.net2.0或者.net4.0的dll),然后在网站中添加引用. .Net导出代码: /// <summ ...
- Js操作DOM小练习_01
1.页面引入jQuery文件和bootstrap文件: 2.贴上代码 <!DOCTYPE html> <html lang="en"> <head&g ...
- c#读取快递100查询返回的JSON信息
{"message":"ok","nu":"1105016801203","companytype" ...
- 不是技术牛人,如何拿到国内IT巨头的Offer(转载)
转载的文章,中间有几段需要去学习. byvoid 面阿里星计划的面试结果截图泄漏,引起无数IT屌丝的羡慕敬仰.看看这些牛人,NOI金牌,开源社区名人,三年级开始写Basic-在跪拜之余我们不禁要想,和 ...
- 再看静态static及相关知识汇集
在C#程序中,没有全局变量的概念,这意味着所有的成员变量只有该类的实例才能操作这些数据,这起到了“信息隐藏”的作用.但有些时候,这样做却不是个明智的选择.C#中静态变量——它在类中类似全局变量,保存类 ...