「JSOI2014」支线剧情2
「JSOI2014」支线剧情2
传送门
不难发现原图是一个以 \(1\) 为根的有根树,所以我们考虑树形 \(\text{DP}\)。
设 \(f_i\) 表示暴力地走完以 \(i\) 为根的子树的最小代价,那么 \(f_i\) 的计算就很显然了:
\]
\(s_i\) 表示以 \(i\) 为根的子树的叶子数。
我们再设一个 \(dp_i\) 表示在可以存档读档的条件下走完以 \(i\) 为根的子树的最小代价。
那么我们的转移就是枚举 \(i\) 的一个儿子用来存档或者不存档,然后计算 \(dp_i\) 即可。
参考代码:
#include <cstdio>
#define rg register
#define file(x) freopen(x".in", "r", stdin), freopen(x".out", "w", stdout)
template < class T > inline T min(T a, T b) { return a < b ? a : b; }
template < class T > inline void read(T& s) {
s = 0; int f = 0; char c = getchar();
while ('0' > c || c > '9') f |= c == '-', c = getchar();
while ('0' <= c && c <= '9') s = s * 10 + c - 48, c = getchar();
s = f ? -s : s;
}
typedef long long LL;
const int _ = 1e6 + 5;
int tot, head[_]; struct Edge { int v, w, nxt; } edge[_ << 1];
inline void Add_edge(int u, int v, int w) { edge[++tot] = (Edge) { v, w, head[u] }, head[u] = tot; }
int n, num[_]; LL f[_], dp[_];
inline void dfs(int u, LL dis) {
if (head[u] == 0) { num[u] = 1; return ; }
LL sum = 0;
for (rg int i = head[u]; i; i = edge[i].nxt) {
int v = edge[i].v, w = edge[i].w;
dfs(v, dis + w), num[u] += num[v], f[u] += f[v] + 1ll * w * num[v];
sum += min(f[v] + 1ll * w * num[v], dp[v] + dis + w);
}
dp[u] = f[u];
for (rg int i = head[u]; i; i = edge[i].nxt) {
int v = edge[i].v, w = edge[i].w;
dp[u] = min(dp[u], sum - min(f[v] + 1ll * w * num[v], dp[v] + dis + w) + dp[v] + w);
}
}
int main() {
#ifndef ONLINE_JUDGE
file("cpp");
#endif
read(n);
for (rg int k, x, y, i = 1; i <= n; ++i) {
read(k);
while (k--) read(x), read(y), Add_edge(i, x, y);
}
dfs(1, 0);
printf("%lld\n", dp[1]);
return 0;
}
「JSOI2014」支线剧情2的更多相关文章
- 「AHOI2014/JSOI2014」支线剧情
「AHOI2014/JSOI2014」支线剧情 传送门 上下界网络流. 以 \(1\) 号节点为源点 \(s\) ,新建一个汇点 \(t\),如果 \(u\) 能到 \(v\),那么连边 \(u \t ...
- 「JSOI2014」矩形并
「JSOI2014」矩形并 传送门 我们首先考虑怎么算这个期望比较好. 我们不难发现每一个矩形要和 \(n - 1\) 个矩形去交,而总共又有 \(n\) 个矩形,所以我们把矩形两两之间的交全部加起来 ...
- 「JSOI2014」打兔子
「JSOI2014」打兔子 传送门 首先要特判 \(k \ge \lceil \frac{n}{2} \rceil\) 的情况,因为此时显然可以消灭所有的兔子,也就是再环上隔一个点打一枪. 但是我们又 ...
- 「JSOI2014」电信网络
「JSOI2014」电信网络 传送门 一个点选了就必须选若干个点,最大化点权之和,显然最大权闭合子图问题. 一个点向它范围内所有点连边,直接跑最大权闭合子图即可. 参考代码: #include < ...
- 「JSOI2014」学生选课
「JSOI2014」学生选课 传送门 看到这题首先可以二分. 考虑对于当前的 \(mid\) 如何 \(\text{check}\) 我们用 \(f_{i,j}\) 来表示 \(i\) 对 \(j\) ...
- 「JSOI2014」歌剧表演
「JSOI2014」歌剧表演 传送门 没想到吧我半夜切的 这道题应该算是 \(\text{JSOI2014}\) 里面比较简单的吧... 考虑用集合关系来表示分辨关系,具体地说就是我们把所有演员分成若 ...
- 「JSOI2014」强连通图
「JSOI2014」强连通图 传送门 第一问很显然就是最大的强连通分量的大小. 对于第二问,我们先把原图进行缩点,得到 \(\text{DAG}\) 后,统计出入度为零的点的个数和出度为零的点的个数, ...
- 「JSOI2014」序列维护
「JSOI2014」序列维护 传送门 其实这题就是luogu的模板线段树2,之所以要发题解就是因为学到了一种比较NB的 \(\text{update}\) 的方式.(参见这题) 我们可以把修改操作统一 ...
- [AHOI2014&&JSOI2014][bzoj3876] 支线剧情 [上下界费用流]
题面 传送门 思路 转化模型:给一张有向无环图,每次你可以选择一条路径走,花费的时间为路径上边权的总和,问要使所有边都被走至少一遍(可以重复),至少需要花费多久 走至少一遍,等价于覆盖这条边 也就是说 ...
随机推荐
- Java进阶学习(5)之设计原则(下)
框架加数据 把数据的硬编码尽可能解成框架加数据的结构 城堡游戏修改后的代码 Room类 package com.castle; import java.util.HashMap; public cla ...
- Spring Boot 升级框架版本 Spring 5.2 Invalid argument syntax org.springframework.core.env.Simple CommandLineArgs
Invalid argument syntax org.springframework.core.env.Simple CommandLineArgs Parser.parse 具体问题应该是启动的c ...
- drf-jwt手动签发与校验,drf小组件:过滤、筛选、排序、分页
复习 """ 频率组件:限制接口的访问频率 源码分析:初始化方法.判断是否有权限方法.计数等待时间方法 自定义频率组件: class MyThrottle(SimpleR ...
- drf三大组件之频率认证组件
复习 """ 1.认证组件:校验认证字符串,得到request.user 没有认证字符串,直接放回None,游客 有认证字符串,但认证失败抛异常,非法用户 有认证字符串, ...
- Go_runtime包
package main import ( "fmt" "runtime" "time" ) //写在init函数里,main函数运行之前就 ...
- Linux挂载(mount,umount及开机自动挂载
挂载概念简述: 根文件系统之外的其他文件要想能够被访问,都必须通过“关联”至根文件系统上的某个目录来实现,此关联操作即为“挂载”,此目录即为“挂载点”,解除此关联关系的过程称之为“卸载” 1.挂载:根 ...
- markdown整理
html标签# h1 ## h2 ### h3 #### h4 ##### h5 ###### h6 一级标题:内容=== 二级标题:内容--- 强调文字:>内容 链接:[文字](链接地址) 图 ...
- linux下的apue.3e安装[Unix环境高级编程]
近期正在看<Unix环境高级编程>一书,目前看了20多页,书中 有几个c的例程,于是想着,也让它运行一下,看看是否跟描述相符,做开发人员本应该这样,于是敲了一部分代码,然后编译,发现并不能 ...
- codeforces-Three Friends
Three Friends Three friends are going to meet each other. Initially, the first friend stays at the ...
- 安卓之滚动视图ScrollView
(1)垂直方向滚动时,layout_width要设置为match_parent,layout_height要设置为wrap_content (2)水平方向滚动时,layout_width要设置为wra ...