BZOJ1812 [IOI2005]river
很常规的一道树规,转为左儿子右兄弟。
然后$f[node][anc][K]$表示在node节点上,最近的有贡献祖先在anc上,在node的儿子和兄弟上有k个有贡献节点的最优值。
然后得出以下转移方程。
$f[node][anc][K]=min\{f[son[node]][anc][k]+f[bro[node]][anc][K-k]\}+Value[node]*(dis[node]-dis[anc])$无贡献
$f[node][anc][K]=min\{f[son[node]][node][k]+f[bro[node]][anc][K-1-k]\}$ 有贡献
下面是代码实现:
//BZOJ 1812 //by Cydiater //2016.9.5 #include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #include <string> #include <algorithm> #include <queue> #include <map> #include <ctime> #include <cmath> #include <iomanip> using namespace std; #define ll long long #define up(i,j,n) for(int i=j;i<=n;i++) #define down(i,j,n) for(int i=j;i>=n;i--) ; const int oo=0x3f3f3f3f; inline int read(){ ,f=; ;ch=getchar();} +ch-';ch=getchar();} return x*f; } ,fa[MAXN],f[MAXN][MAXN][MAXN],pre_fa[MAXN]; struct edge{ int y,next,v; }e[MAXN<<]; namespace solution{ inline void insert(int x,int y,int v){e[++len].next=LINK[x];LINK[x]=len;e[len].y=y;e[len].v=v;} void dfs(int node){ for(int i=LINK[node];i;i=e[i].next){ dis[e[i].y]=dis[node]+e[i].v; dfs(e[i].y); } } void init(){ N=read();K=read(); pre_fa[]=-; up(i,,N){ Value[i]=read();int y=read(),v=read(); pre_fa[i]=y; insert(y,i,v); } dfs();dis[]=; } void build(int node,int father){ int tmp=LINK[node];son[node]=e[tmp].y;fa[node]=father; if(tmp)build(e[tmp].y,node);node=e[tmp].y; for(int i=e[tmp].next;i;i=e[i].next){ bro[node]=e[i].y;build(e[i].y,node); node=e[i].y; } } void TreeDP(int node){ if(son[node])TreeDP(son[node]); if(bro[node])TreeDP(bro[node]); int father=pre_fa[node]; ){ up(lim,,K)up(k,,lim){ int tmp=Value[node]*(dis[node]-dis[father]); if(son[node])tmp+=f[son[node]][father][k]; if(bro[node])tmp+=f[bro[node]][father][lim-k]; f[node][father][lim]=min(f[node][father][lim],tmp); } up(lim,,K)up(k,,lim){ ; ]; if(bro[node])tmp+=f[bro[node]][father][lim-k]; f[node][father][lim]=min(f[node][father][lim],tmp); } father=pre_fa[father]; } ){ father=; up(lim,,K)up(k,,lim){ ; if(son[node])tmp+=f[son[node]][father][k]; if(bro[node])tmp+=f[bro[node]][father][lim-k]; f[node][father][lim]=min(f[node][father][lim],tmp); } } } void slove(){ build(,-); memset(f,0x3f,sizeof(f)); TreeDP(); printf(][][K]); } } int main(){ //freopen("input.in","r",stdin); using namespace solution; init(); slove(); ; }
BZOJ1812 [IOI2005]river的更多相关文章
- [Ioi2005]River
设f[i][j][k]表示i上游最近的一个伐木场为j且在i所在的子树里共建了k个伐木场(不包含在i的)的最小运费和 设v为u的儿子,dist[u]为u到0号点的距离. 则当i>=j时 f[u][ ...
- bzoj1812 [Ioi2005]riv
riv 几乎整个Byteland王国都被森林和河流所覆盖.小点的河汇聚到一起,形成了稍大点的河.就这样,所有的河水都汇聚并流进了一条大河,最后这条大河流进了大海.这条大河的入海口处有一个村庄--名叫B ...
- [IOI2005]River 河流
题目大意: 给定n个点的有根树,每条边有边权,每个点有点权w, 你要在k个点上建立伐木场,对于每个没有建伐木场的点x,令与它最近的祖先.有伐木场的点,为y,你需要支付dis(x,y)*w[x]的代价. ...
- BZOJ1812: [Ioi2005]riv(树形dp)
题意 题目链接 Sol 首先一个很显然的思路是直接用\(f[i][j] / g[i][j]\)表示\(i\)的子树中选了\(j\)个节点,该节点是否选的最小权值.但是直接这样然后按照树形背包的套路转移 ...
- bzoj1812 [IOI2005]riv河流
题目链接 problem 给出一棵树,每个点有点权,每条边有边权.0号点为根,每个点的代价是这个点的点权\(\times\)该点到根路径上的边权和. 现在可以选择最多K个点.使得每个点的代价变为:这个 ...
- [学习笔记]对未来做出承诺的DP小结
这是一种DP状态设计方法. 有些题,当你必须以一个顺序往后填的话,然而后面的填法会对之前产生影响,那么,不妨在之前就对未来怎么填做出承诺. 通俗的讲,就是对未来打一个表. 然后后面填的时候,直接查表转 ...
- 【BZOJ1812】[Ioi2005]riv 树形DP
[BZOJ1812][Ioi2005]riv Description 几乎整个Byteland王国都被森林和河流所覆盖.小点的河汇聚到一起,形成了稍大点的河.就这样,所有的河水都汇聚并流进了一条大河, ...
- 【BZOJ1812】riv(多叉树转二叉树,树形DP)
题意:给定一棵树,每个点有权值,每条边有边权(单向边).你可以选取K个黑点,使得从每个点移动到距离他最近的黑点的花费(距离*点权)的总和最小. n<=100 k<=50 w[i],a[i] ...
- Moon River
读书笔记系列链接地址http://www.cnblogs.com/shoufengwei/p/5714661.html. 昨晚无意中听到了一首英文歌曲,虽不知其意,但是瞬间就被优美的旋律 ...
随机推荐
- unity3d Vector3.Lerp解析
Vector3.Lerp:http://www.ceeger.com/Script/Vector3/Vector3.Lerp.html 手册中描述的不是很详细,什么叫“按照数字t在from到to之间插 ...
- [译]用AngularJS构建大型ASP.NET单页应用(二)
原文地址:http://www.codeproject.com/Articles/808213/Developing-a-Large-Scale-Application-with-a-Single 客 ...
- C++学习准则
C++学习准则 1.把C++当成一门新的语言学习(和C没啥关系!真的): 2.看<Thinking In C++>,不要看<C++变成死相>(C++编程思想,翻译的非常差): ...
- java文件cmd运行出现中文乱码
今天刚开始学java,使用cmd命令执行java文件的时候,发现中文打出来是一串乱码. 于是就百度了一下,发现一个行之有效的方法. 首先使用命令:javac -encoding utf-8 Hello ...
- LaTeX常用数学符号表示方法
转自:http://www.mohu.org/info/symbols/symbols.htm 常用数学符号的 LaTeX 表示方法 (以下内容主要摘自“一份不太简短的 LATEX2e 介绍”) 1. ...
- Social Emotional Computing -情感模式与价值变化
情感模式与价值变化 第七节 情感模式与价值变化 情感与价值的关系是主观与客观的关系,人的情感不管多么飘忽不定,都可以找到它的价值对应物,情感的任何变化都可以从价值关系的变动中找到它的客观动因,情感的不 ...
- android服务之录音功能
该服务的作用是当打电话时自动录音. 布局文件 布局文件中开启录音服务 <?xml version="1.0" encoding="utf-8"?> ...
- 深入浅出ASP.NET MVC5系列之一
前言 为避免看官乏味,本系列博客限定在较新的.Net framework 4.5.1,Asp.net MVC5,IIS 7.X集成模式. 对于微软应用层的技术.我向来不舍得花太多时间学习.但又由于公司 ...
- hiho一下 第六十六周
题目链接:这是一道水爆了的广搜题 #include<iostream> #include<stdio.h> #include<algorithm> #include ...
- Python 练习册
01:将你的 QQ 头像(或者微博头像)右上角加上红色的数字,类似于微信未读信息数量那种提示效果 [图像处理] 类似于图中效果: py 2.7代码: from PIL import Image, Im ...