有点权边权的树,选出k个关键点,根必须选。每个点的贡献为点权 * 到最近的关键祖先的距离。求最小总贡献。

解:树形DP是最毒瘤的算法......

设fxij表示以x为根的子树中选了j个关键点,且x的最近关键祖先是它的i级祖先时的最小贡献。

初态:fxi0 = val[x] * dis(),fx01 = 0。

转移:注意到各个i之间是分层转移的,只有女儿i = 0的情况会转移到母亲的每个i。

于是先转移fy0r,再分层转移fyjr。每层是一个树上背包。

 #include <bits/stdc++.h>

 typedef long long LL;
const int N = ; struct Edge {
int nex, v, len;
}edge[N]; int tp; int e[N], n, siz[N], fa[N], val[N], k;
LL f[N][N][N], temp[N][N], d[N]; inline void add(int x, int y, int z) {
tp++;
edge[tp].v = y;
edge[tp].len = z;
edge[tp].nex = e[x];
e[x] = tp;
return;
} inline LL dis(int x, int t) {
int y = x;
for(int i = ; i <= t; i++) {
y = fa[y];
}
return d[x] - d[y];
}
/*
2 1
1 0 2
1 0 3
------------- 2
*/
void DFS(int x) {
//printf("x = %d d[x] = %lld fa[x] = %d \n", x, d[x], fa[x]);
siz[x] = ;
for(int i = ; i <= n; i++) {
f[x][i][] = val[x] * dis(x, i);
//printf("f %d %d %d = %lld = %d * %d\n", x, i, 0, f[x][i][0], val[x], dis(x, i));
}
f[x][][] = ;
for(int i = e[x]; i; i = edge[i].nex) {
int y = edge[i].v;
//printf("%d -> %d \n", x, y);
d[y] = d[x] + edge[i].len;
DFS(y);
memcpy(temp, f[x], sizeof(f[x]));
memset(f[x], 0x3f, sizeof(f[x]));
for(int j = ; j <= n; j++) { /// dis
for(int p = ; p <= k; p++) {
for(int r = ; r <= p; r++) {
//printf("r = %d -> %lld \n", r, temp[j][p - r] + f[y][0][r]);
f[x][j][p] = std::min(f[x][j][p], temp[j][p - r] + f[y][][r]); /// don't choose
}
//printf("1f %d %d %d = %lld \n", x, j, p, f[x][j][p]);
}
}
for(int j = ; j <= n; j++) {
for(int p = k; p >= ; p--) {
for(int r = ; r <= p; r++) {
f[x][j][p] = std::min(f[x][j][p], temp[j][p - r] + f[y][j + ][r]); /// choose y
}
//printf("2f %d %d %d = %lld \n", x, j, p, f[x][j][p]);
}
}
siz[x] += siz[y];
}
//printf("%d return \n", x);
return;
} int main() {
memset(f, 0x3f, sizeof(f));
scanf("%d%d", &n, &k);
n++; k++;
k = std::min(k, n);
for(int i = , x, y; i <= n; i++) {
scanf("%d%d%d", &val[i], &x, &y);
add(x + , i, y);
fa[i] = x + ;
} DFS(); printf("%lld\n", f[][][k]);
return ;
}

AC代码

注意每次合并子树的时候,原来的值不能保留。保留下来的要加上fy0r

恶心死我了...

洛谷P3354 河流的更多相关文章

  1. 洛谷P3354 [IOI2005]Riv 河流——“承诺”DP

    题目:https://www.luogu.org/problemnew/show/P3354 状态中要记录一个“承诺”,只需相同承诺之间相互转移即可: 然后就是树形DP的套路了. 代码如下: #inc ...

  2. 洛谷P3354 Riv河流 [IOI2005] 树型dp

    正解:树型dp 解题报告: 传送门! 简要题意:有棵树,每个节点有个权值w,要求选k个节点,最大化∑dis*w,其中如果某个节点到根的路径上选了别的节点,dis指的是到达那个节点的距离 首先这个一看就 ...

  3. 洛谷1640 bzoj1854游戏 匈牙利就是又短又快

    bzoj炸了,靠离线版题目做了两道(过过样例什么的还是轻松的)但是交不了,正巧洛谷有个"大牛分站",就转回洛谷做题了 水题先行,一道傻逼匈牙利 其实本来的思路是搜索然后发现写出来类 ...

  4. 洛谷P1352 codevs1380 没有上司的舞会——S.B.S.

    没有上司的舞会  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond       题目描述 Description Ural大学有N个职员,编号为1~N.他们有 ...

  5. 洛谷P1108 低价购买[DP | LIS方案数]

    题目描述 “低价购买”这条建议是在奶牛股票市场取得成功的一半规则.要想被认为是伟大的投资者,你必须遵循以下的问题建议:“低价购买:再低价购买”.每次你购买一支股票,你必须用低于你上次购买它的价格购买它 ...

  6. 洛谷 P2701 [USACO5.3]巨大的牛棚Big Barn Label:二维数组前缀和 你够了 这次我用DP

    题目背景 (USACO 5.3.4) 题目描述 农夫约翰想要在他的正方形农场上建造一座正方形大牛棚.他讨厌在他的农场中砍树,想找一个能够让他在空旷无树的地方修建牛棚的地方.我们假定,他的农场划分成 N ...

  7. 洛谷P1710 地铁涨价

    P1710 地铁涨价 51通过 339提交 题目提供者洛谷OnlineJudge 标签O2优化云端评测2 难度提高+/省选- 提交  讨论  题解 最新讨论 求教:为什么只有40分 数组大小一定要开够 ...

  8. 洛谷P1371 NOI元丹

    P1371 NOI元丹 71通过 394提交 题目提供者洛谷OnlineJudge 标签云端评测 难度普及/提高- 提交  讨论  题解 最新讨论 我觉得不需要讨论O long long 不够 没有取 ...

  9. 洛谷P1538迎春舞会之数字舞蹈

    题目背景 HNSDFZ的同学们为了庆祝春节,准备排练一场舞会. 题目描述 在越来越讲究合作的时代,人们注意的更多的不是个人物的舞姿,而是集体的排列. 为了配合每年的倒计时,同学们决定排出——“数字舞蹈 ...

随机推荐

  1. Linux上的一些基本常用命令

    上传下载文件:// 首先安装lrzsz # yum -y install lrzsz // 上传文件,执行命令rz,会跳出文件选择窗口,选择好文件,点击确认即可.# rz // 下载文件,执行命令sz ...

  2. 重启iis命令

    iisreset

  3. Failed to execute goal org.apache.maven.plugins:maven-clean-plugin:2.5:clean (default-

    Maven项目报错:Failed to execute goal org.apache.maven.plugins:maven-clean-plugin:2.5:clean (default-clea ...

  4. python(Django之组合搜索、JSONP、XSS过滤 )

    一.组合搜索 二.jsonp 三.xss过滤 一.组合搜索 首先,我们在做一个门户网站的时候,前端肯定是要进行搜索的,但是如果搜索的类型比较多的话,怎么做才能一目了然的,这样就引出了组合搜索的这个案例 ...

  5. 不使用DataContext直接将ViewModels绑定到ItemsControl控件

    在常规的MVVM设计模式中,都是通过DataContext将ViewModels的一个对象绑定到View的DataContext中,从而完成相应地绑定,在本文中我们将通过另外的一种思路来将ViewMo ...

  6. Java的hashCode和equals方法

    当然健壮的代码,两个都重写那是最好. 用不到hashCode的, 也没有必要重写hashCode. 个人感觉. 哈希机制的Java集合类,例如 Hashtable, HashMap, HashSet ...

  7. poj-1459(网络流-最大流)

    题意:给你n个点的电网系统,有一些点是电站,能提供p的电能,有些点是用户,能消耗c的电能,有些是过渡站,不消耗不产生(等于没用),然后m条电线(x,y,w),代表x可以向y运输w的电能,问你这个电网系 ...

  8. Nginx http keepalive针对客户端行为指令

    keepalive 描述 多个http请求可以复用Tcp链接  减少握手次数 通过减少并发连接数减少服务器资源消耗 降低Tcp拥塞控制影响 Syntax: keepalive_disable none ...

  9. 简单介绍一下在CentOS上安装Docker。

    简单介绍一下在CentOS上安装Docker. 前置条件: 64-bit 系统 kernel 3.10+ 1.检查内核版本,返回的值大于3.10即可. $ uname -r 2.使用 sudo 或 r ...

  10. HTML协议

    一,HTML协议 简介 超文本传输协议(英文:HyperText Transfer Protocol,缩写:HTTP)是一种用于分布式.协作式和超媒体信息系统的应用层协议.HTTP是万维网的数据通信的 ...