有点权边权的树,选出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. Day 6-3 粘包现象

    服务端: import socket import subprocess phone = socket.socket(family=socket.AF_INET, type=socket.SOCK_S ...

  2. 剑指offer(7)

    今天的几道题目都是关于斐波那契数列的. 题目1: 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0). n<=39 传统的方法采用递归函数,这种 ...

  3. 5款Python程序员高频使用开发工具推荐

    很多Python学习者想必都会有如下感悟:最开始学习Python的时候,因为没有去探索好用的工具,吃了很多苦头.后来工作中深刻体会到,合理使用开发的工具的便利和高效.今天,我就把Python程序员使用 ...

  4. python数据结构与算法第七天【链表】

    1.链表的定义 如图: 注意: (1)线性表包括顺序表和链表 (2)顺序表是将元素顺序地存放在一块连续的存储区里 (3)链表是将元素存放在通过链构造的存储快中 2. 单向链表的实现 #!/usr/bi ...

  5. DButils实现数据库表下划线转bean中驼峰格式

    准备: QueryRunner queryRunner = new QueryRunner();//开启下划线->驼峰转换所用BeanProcessor bean = new GenerousB ...

  6. (转载)C#使用MemoryStream类读写内存

    MemoryStream和BufferedStream都派生自基类Stream,因此它们有很多共同的属性和方法,但是每一个类都有自己独特的用法.这两个类都是实现对内存进行数据读写的功能,而不是对持久性 ...

  7. Lodop生成文档式模版

    Lodop模版有两种方法,一种是传统的JS语句,可以用JS方法里的eval来执行,一种是文档式模版,是特殊格式的base64码,此篇博文介绍文档式模版的生成方法.两种模版都可以存入一下地方进行调用,比 ...

  8. sql行转列实例

    select gh ,xm , max(A.bz) as bz , max(A.jcz) as jcz , max(A.dl) as dl , max(A.czzx) as czzx , max(A. ...

  9. 使用@Validated分组遇到的坑

    在使用@Validate注解分组校验时,如果指定分组,所有的需要验证的属性都必须添加指定分组才会校验 解决办法: 没有指明分组的属性都属于Default,所以分组接口继承Default就可以解决

  10. 启动docker容器 防火墙问题报错 ! -i docker0' failed: iptables: No chain/target/match by that name.

    COMMAND_FAILED: '/sbin/iptables -t nat -A DOCKER -p tcp -d 0/0 --dport 8111 -j DNAT --to-destination ...