洛谷P3354 河流
有点权边权的树,选出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 河流的更多相关文章
- 洛谷P3354 [IOI2005]Riv 河流——“承诺”DP
题目:https://www.luogu.org/problemnew/show/P3354 状态中要记录一个“承诺”,只需相同承诺之间相互转移即可: 然后就是树形DP的套路了. 代码如下: #inc ...
- 洛谷P3354 Riv河流 [IOI2005] 树型dp
正解:树型dp 解题报告: 传送门! 简要题意:有棵树,每个节点有个权值w,要求选k个节点,最大化∑dis*w,其中如果某个节点到根的路径上选了别的节点,dis指的是到达那个节点的距离 首先这个一看就 ...
- 洛谷1640 bzoj1854游戏 匈牙利就是又短又快
bzoj炸了,靠离线版题目做了两道(过过样例什么的还是轻松的)但是交不了,正巧洛谷有个"大牛分站",就转回洛谷做题了 水题先行,一道傻逼匈牙利 其实本来的思路是搜索然后发现写出来类 ...
- 洛谷P1352 codevs1380 没有上司的舞会——S.B.S.
没有上司的舞会 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description Ural大学有N个职员,编号为1~N.他们有 ...
- 洛谷P1108 低价购买[DP | LIS方案数]
题目描述 “低价购买”这条建议是在奶牛股票市场取得成功的一半规则.要想被认为是伟大的投资者,你必须遵循以下的问题建议:“低价购买:再低价购买”.每次你购买一支股票,你必须用低于你上次购买它的价格购买它 ...
- 洛谷 P2701 [USACO5.3]巨大的牛棚Big Barn Label:二维数组前缀和 你够了 这次我用DP
题目背景 (USACO 5.3.4) 题目描述 农夫约翰想要在他的正方形农场上建造一座正方形大牛棚.他讨厌在他的农场中砍树,想找一个能够让他在空旷无树的地方修建牛棚的地方.我们假定,他的农场划分成 N ...
- 洛谷P1710 地铁涨价
P1710 地铁涨价 51通过 339提交 题目提供者洛谷OnlineJudge 标签O2优化云端评测2 难度提高+/省选- 提交 讨论 题解 最新讨论 求教:为什么只有40分 数组大小一定要开够 ...
- 洛谷P1371 NOI元丹
P1371 NOI元丹 71通过 394提交 题目提供者洛谷OnlineJudge 标签云端评测 难度普及/提高- 提交 讨论 题解 最新讨论 我觉得不需要讨论O long long 不够 没有取 ...
- 洛谷P1538迎春舞会之数字舞蹈
题目背景 HNSDFZ的同学们为了庆祝春节,准备排练一场舞会. 题目描述 在越来越讲究合作的时代,人们注意的更多的不是个人物的舞姿,而是集体的排列. 为了配合每年的倒计时,同学们决定排出——“数字舞蹈 ...
随机推荐
- 日期选择器date、week、time、datetime、datetime-local类型
下面只写两个类型的代码案例,其他都大同小异 date类型: <!DOCTYPE html> <html> <head> <meta charset=" ...
- .Net在操作mysql查询的时候出现“: Unknown column 'UserName' in 'where clause'”错误
今天使用.Net操作mysql查询的时候,如果加上条件查询的时候就会出现 Unknown column 'UserName' in 'where clause'这个错,不加条件直接select * f ...
- 剑指offer(4)
题目: 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2 ...
- Vue 刷新当前页面,并重新加载页面数据
业务场景:在管理后台,在执行完,增,删,改,操作的时候.我们需要刷新一下页面,重载数据.在JQ中我们会用到location.reload()方法,刷新页面:在vue中,这里需要用到一个 provide ...
- mysql逻辑架构
逻辑架构图 MySQL有点与众不同,它的逻辑架构可以在多种不同的场景中应用并发挥良好的作用.主要体现在存储引擎的架构上,插件式的存储引擎架构将查询处理和其他的系统任务以及数据的存储提取相分离.这种架构 ...
- win10 新建文件夹没有了
1运行-regedit 2 在打开的注册表编辑器窗口,展开HKEY_CLASSES_ROOT,在HKEY_CLASSES_ROOT展开项中找到:Directory,再依次展开:Directory\Ba ...
- HDU 5025 Saving Tang Monk
Problem Description <Journey to the West>(also <Monkey>) is one of the Four Great Classi ...
- Software License Manager
slmgr -ilc lenovo.xrm-ms slmgr -ipk lenovo-lenovo-lenovo-lenovo-lenovo
- 如何在虚拟机下配置centOS7
链接地址:https://baijiahao.baidu.com/s?id=1597320700700593557&wfr=spider&for=pc
- 牛客网-2018年全国多校算法寒假训练营练习比赛(第四场)-A
解题思路:二分图的最大匹配,但这题是所有点都遍历一遍,所以答案/2: 代码: #include<iostream> #include<algorithm> #include&l ...