rivers ioi2005 树形dp
说句实话,写完这道题,很想吐一口血出来,以示我心情的糟糕;
题目很简单,树形dp,正常做30分钟,硬是做了好几个小时,真是伤心。
题解不写了,只是吐个槽,网上没有用背包写的dp,全是左儿子右兄弟写法,没法对照一下,难受啊。
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define LL long long
int n,K;
const int maxn=;
const LL inf=3000000000LL;
struct node{
int y,next,v;
}e[maxn];
int linkk[maxn],len=,w[maxn],d[maxn][maxn],siz[maxn],q[maxn],tail=,fa[maxn],ru[maxn],vis[maxn];
int read(){
int x=;char ch=getchar();bool flag=;
while(ch<''||ch>''){if(ch=='-')flag=;ch=getchar();}
while(ch<=''&&ch>=''){x=x*+ch-'';ch=getchar();}
return flag?-x:x;
}
void insert(int x,int y,int v){
e[++len].y=y;
e[len].v=v;
e[len].next=linkk[x];
linkk[x]=len;
}
void print(int x){printf("%d\n",x);}
void print(int x,int y){printf("%d %d\n",x,y);}
void init(){
int y,v;
n=read(),K=read();
memset(d,,sizeof(d));
for(int i=;i<=n;i++){
w[i]=read(),y=read(),v=read();
insert(i,y,v);insert(y,i,v);
d[i][y]=v,d[y][i]=v;
} }
void findd(){
for(int i=;i<=n;i++)d[i][i]=;
for(int k=;k<=n;k++)
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
if(d[i][k]+d[k][j]<d[i][j])d[i][j]=d[i][k]+d[k][j];
}
LL f[][][];
void dfs(int x,int f){
siz[x]=;
fa[x]=f;
for(int i=linkk[x];i;i=e[i].next){
if(e[i].y==f)continue;
dfs(e[i].y,x);
siz[x]+=siz[e[i].y];
ru[x]++;
}
if(siz[x]==)q[++tail]=x;
}
void work(){
memset(f,-,sizeof(f));
findd();
dfs(,);
for(int head=;head<=tail;head++){
int x=q[head];
ru[fa[x]]--;
if(ru[fa[x]]==)q[++tail]=fa[x];
LL g[];
for(int k=;k<=siz[x]&&k<=K;k++){
for(int prev=fa[x];prev!=-;prev=fa[prev]){ for(int p=;p<=k;p++)g[p]=;
for(int i=linkk[x];i;i=e[i].next){
if(e[i].y==fa[x])continue;
LL minn=inf;
for(int j=k;j>=;j--){
minn=inf;
for(int l=;l<=siz[e[i].y]&&l<=j;l++)
minn=min(minn,g[j-l]+f[e[i].y][l][prev]);
g[j]=minn;
}
}
LL ans=g[k]+w[x]*d[prev][x];
for(int p=;p<=k;p++)g[p]=;
for(int i=linkk[x];i;i=e[i].next){
if(e[i].y==fa[x])continue;
LL minn=inf;
for(int j=k-;j>=;j--){
minn=inf;
for(int l=;l<=siz[e[i].y]&&l<=j;l++)
minn=min(minn,g[j-l]+f[e[i].y][l][x]);
g[j]=minn;
}
}
f[x][k][prev]=min(ans,k-<?inf:g[k-]);
if(!prev)break;
}
}
}
cout<<f[][K][]<<endl;
}
int main(){
freopen("1.in","r",stdin);
freopen("1.out","w",stdout);
init();
work();
}
rivers ioi2005 树形dp的更多相关文章
- 【BZOJ1812】[Ioi2005]riv 树形DP
[BZOJ1812][Ioi2005]riv Description 几乎整个Byteland王国都被森林和河流所覆盖.小点的河汇聚到一起,形成了稍大点的河.就这样,所有的河水都汇聚并流进了一条大河, ...
- BZOJ_1812_[Ioi2005]riv_树形DP
BZOJ_1812_[Ioi2005]riv_树形DP Description 几乎整个Byteland王国都被森林和河流所覆盖.小点的河汇聚到一起,形成了稍大点的河.就这样,所有的河水都汇聚并流进了 ...
- poj3417 LCA + 树形dp
Network Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 4478 Accepted: 1292 Descripti ...
- COGS 2532. [HZOI 2016]树之美 树形dp
可以发现这道题的数据范围有些奇怪,为毛n辣么大,而k只有10 我们从树形dp的角度来考虑这个问题. 如果我们设f[x][k]表示与x距离为k的点的数量,那么我们可以O(1)回答一个询问 可是这样的话d ...
- 【BZOJ-4726】Sabota? 树形DP
4726: [POI2017]Sabota? Time Limit: 20 Sec Memory Limit: 128 MBSec Special JudgeSubmit: 128 Solved ...
- 树形DP+DFS序+树状数组 HDOJ 5293 Tree chain problem(树链问题)
题目链接 题意: 有n个点的一棵树.其中树上有m条已知的链,每条链有一个权值.从中选出任意个不相交的链使得链的权值和最大. 思路: 树形DP.设dp[i]表示i的子树下的最优权值和,sum[i]表示不 ...
- 树形DP
切题ing!!!!! HDU 2196 Anniversary party 经典树形DP,以前写的太搓了,终于学会简单写法了.... #include <iostream> #inclu ...
- BZOJ 2286 消耗战 (虚树+树形DP)
给出一个n节点的无向树,每条边都有一个边权,给出m个询问,每个询问询问ki个点,问切掉一些边后使得这些顶点无法与顶点1连接.最少的边权和是多少.(n<=250000,sigma(ki)<= ...
- POJ2342 树形dp
原题:http://poj.org/problem?id=2342 树形dp入门题. 我们让dp[i][0]表示第i个人不去,dp[i][1]表示第i个人去 ,根据题意我们可以很容易的得到如下递推公式 ...
随机推荐
- LevelDB源码之四LOG文件
“LOG文件在LevelDb中的主要作用是系统故障恢复时,能够保证不会丢失数据.因为在将记录写入内存的Memtable之前,会先写入Log文件,这样即使系统发生故障,Memtable中的数据没有来得及 ...
- 配置pxe 自动化安装centos6.7
dhcp服务器是pxe自动化安装的必要条件,因此先搞定dhcp服务器,yum -y install dhcp, rpm -ql dhcp查看安装了哪些包,less /etc/dhcp/dhcpd.c ...
- PHP导出excel文件
现在教教你如何导入excel文件: 在我的文件储存里面有一个com文件夹的,将其解压放在ThinkPHP/Library/文件夹里面,然后就是写控制器啦!去调用这个插件: <?php names ...
- PHP代码优化的53个细节
PHP代码优化的53个细节,常见而重要的php优化策略. 用单引号代替双引号来包含字符串,这样做会更快一些.因为PHP会在双引号包围的字符串中搜寻变量,单引号则不会,注意:只有echo能这么做,它是一 ...
- BufferedReader,缓冲输入字符流
1. /** * 输入字符流: * --------|Reader 所有输入字符流的基类.抽象类 * -----------|FileReader 读取文件字符串的输入字符流. * --------- ...
- Delphi 泛型对象类
{ 很早就写了. 只针对delphixe 以上的版本可用. 希望不是自己在造轮子. } 1 unit U_ClassUtility; interface uses generics.defaults, ...
- 一些关于python的小感想
python是一门优秀的语言,但随之而来的是大量的知识,各种模块,相信一个人的大脑是很难记住如此多的内容.这时后的我们就应该想办法避免去记忆这么多的内容. 1.查看官方文档(英语很重要,啥也不说了) ...
- linux系统设置-防火墙
基础知识 Linux系统内核内建了netfilter防火墙机制.Netfilter(数据包过滤机制),所谓的数据包过滤,就是分析进入主机的网络数据包,将数据包的头部数据提取出来进行分析,以决该连接为放 ...
- oracle11g 新特性 - rman自动备份控制文件延迟
OS: Oracle Linux Server release 5.7 DB: Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 -6 ...
- CentOS6.4上搭建hadoop-2.4.0集群
公司Commerce Cloud平台上提供申请主机的服务.昨天试了下,申请了3台机器,搭了个hadoop环境.以下是机器的一些配置: emi-centos-6.4-x86_64medium | 6GB ...