「JSOI2014」支线剧情2

传送门

不难发现原图是一个以 \(1\) 为根的有根树,所以我们考虑树形 \(\text{DP}\)。

设 \(f_i\) 表示暴力地走完以 \(i\) 为根的子树的最小代价,那么 \(f_i\) 的计算就很显然了:

\[f_i = \sum_{j \in son_i}f_j + s_j \times dis(i, j)
\]

\(s_i\) 表示以 \(i\) 为根的子树的叶子数。

我们再设一个 \(dp_i\) 表示在可以存档读档的条件下走完以 \(i\) 为根的子树的最小代价。

那么我们的转移就是枚举 \(i\) 的一个儿子用来存档或者不存档,然后计算 \(dp_i\) 即可。

参考代码:

  1. #include <cstdio>
  2. #define rg register
  3. #define file(x) freopen(x".in", "r", stdin), freopen(x".out", "w", stdout)
  4. template < class T > inline T min(T a, T b) { return a < b ? a : b; }
  5. template < class T > inline void read(T& s) {
  6. s = 0; int f = 0; char c = getchar();
  7. while ('0' > c || c > '9') f |= c == '-', c = getchar();
  8. while ('0' <= c && c <= '9') s = s * 10 + c - 48, c = getchar();
  9. s = f ? -s : s;
  10. }
  11. typedef long long LL;
  12. const int _ = 1e6 + 5;
  13. int tot, head[_]; struct Edge { int v, w, nxt; } edge[_ << 1];
  14. inline void Add_edge(int u, int v, int w) { edge[++tot] = (Edge) { v, w, head[u] }, head[u] = tot; }
  15. int n, num[_]; LL f[_], dp[_];
  16. inline void dfs(int u, LL dis) {
  17. if (head[u] == 0) { num[u] = 1; return ; }
  18. LL sum = 0;
  19. for (rg int i = head[u]; i; i = edge[i].nxt) {
  20. int v = edge[i].v, w = edge[i].w;
  21. dfs(v, dis + w), num[u] += num[v], f[u] += f[v] + 1ll * w * num[v];
  22. sum += min(f[v] + 1ll * w * num[v], dp[v] + dis + w);
  23. }
  24. dp[u] = f[u];
  25. for (rg int i = head[u]; i; i = edge[i].nxt) {
  26. int v = edge[i].v, w = edge[i].w;
  27. dp[u] = min(dp[u], sum - min(f[v] + 1ll * w * num[v], dp[v] + dis + w) + dp[v] + w);
  28. }
  29. }
  30. int main() {
  31. #ifndef ONLINE_JUDGE
  32. file("cpp");
  33. #endif
  34. read(n);
  35. for (rg int k, x, y, i = 1; i <= n; ++i) {
  36. read(k);
  37. while (k--) read(x), read(y), Add_edge(i, x, y);
  38. }
  39. dfs(1, 0);
  40. printf("%lld\n", dp[1]);
  41. return 0;
  42. }

「JSOI2014」支线剧情2的更多相关文章

  1. 「AHOI2014/JSOI2014」支线剧情

    「AHOI2014/JSOI2014」支线剧情 传送门 上下界网络流. 以 \(1\) 号节点为源点 \(s\) ,新建一个汇点 \(t\),如果 \(u\) 能到 \(v\),那么连边 \(u \t ...

  2. 「JSOI2014」矩形并

    「JSOI2014」矩形并 传送门 我们首先考虑怎么算这个期望比较好. 我们不难发现每一个矩形要和 \(n - 1\) 个矩形去交,而总共又有 \(n\) 个矩形,所以我们把矩形两两之间的交全部加起来 ...

  3. 「JSOI2014」打兔子

    「JSOI2014」打兔子 传送门 首先要特判 \(k \ge \lceil \frac{n}{2} \rceil\) 的情况,因为此时显然可以消灭所有的兔子,也就是再环上隔一个点打一枪. 但是我们又 ...

  4. 「JSOI2014」电信网络

    「JSOI2014」电信网络 传送门 一个点选了就必须选若干个点,最大化点权之和,显然最大权闭合子图问题. 一个点向它范围内所有点连边,直接跑最大权闭合子图即可. 参考代码: #include < ...

  5. 「JSOI2014」学生选课

    「JSOI2014」学生选课 传送门 看到这题首先可以二分. 考虑对于当前的 \(mid\) 如何 \(\text{check}\) 我们用 \(f_{i,j}\) 来表示 \(i\) 对 \(j\) ...

  6. 「JSOI2014」歌剧表演

    「JSOI2014」歌剧表演 传送门 没想到吧我半夜切的 这道题应该算是 \(\text{JSOI2014}\) 里面比较简单的吧... 考虑用集合关系来表示分辨关系,具体地说就是我们把所有演员分成若 ...

  7. 「JSOI2014」强连通图

    「JSOI2014」强连通图 传送门 第一问很显然就是最大的强连通分量的大小. 对于第二问,我们先把原图进行缩点,得到 \(\text{DAG}\) 后,统计出入度为零的点的个数和出度为零的点的个数, ...

  8. 「JSOI2014」序列维护

    「JSOI2014」序列维护 传送门 其实这题就是luogu的模板线段树2,之所以要发题解就是因为学到了一种比较NB的 \(\text{update}\) 的方式.(参见这题) 我们可以把修改操作统一 ...

  9. [AHOI2014&&JSOI2014][bzoj3876] 支线剧情 [上下界费用流]

    题面 传送门 思路 转化模型:给一张有向无环图,每次你可以选择一条路径走,花费的时间为路径上边权的总和,问要使所有边都被走至少一遍(可以重复),至少需要花费多久 走至少一遍,等价于覆盖这条边 也就是说 ...

随机推荐

  1. sqli-libs总结

    security数据库中: select left(database(),1)=‘s’;   前1位是否是s: select database() regexp ‘s’;  匹配第一个字符是否是 s: ...

  2. c/c++学习01

    c++指针初始赋值: //指针初始赋值 int* a = new int(3); //第二种赋值 int 初始值 = 100; int *b = &初始值; //由new分配的内存块通常使用过 ...

  3. Educational Codeforces Round 80 (Rated for Div. 2)D(二分答案,状压检验)

    这题1<<M为255,可以logN二分答案后,N*M扫一遍表把N行数据转化为一个小于等于255的数字,再255^2检验答案(比扫一遍表复杂度低),复杂度约为N*M*logN #define ...

  4. zabbix-server报错:No route to host

    前戏: 我在VM虚拟机中创建了2个liunx系统(rhel7和cent7),一个用作zabbix服务端,另一个用作zabbix客户端.但是用服务端监控客户端时图标是红色的监控不了,报错信息为:Get ...

  5. python中写入txt文件需要换行,以及\r 和\n

    在Python中,用open()函数打开一个txt文件,写入一行数据之后需要一个换行 如果直接用 f.write(’\n’)只会在后面打印一个字符串’\n’,而不是换行’需要用 f.write(’\r ...

  6. python 读写函数

    1.open 使用open打开文件后一定要记得调用文件对象的close()方法.比如可以用try/finally语句来确保最后能关闭文件. file_object = open('thefile.tx ...

  7. acm数论之旅--组合数(转载)

    随笔 - 20  文章 - 0  评论 - 73 ACM数论之旅8---组合数(组合大法好(,,• ₃ •,,) )  补充:全错排公式:https://blog.csdn.net/Carey_Lu/ ...

  8. jmeter循环读取数据库中的数据

    1,添加一个jdbc请求 2,添加一个循环控制器,循环的次数为sql返回的记录数${var_#} 3,添加一个计数器(用来做变量拼接) 4,拼接变量,往目标接口发请求 最后脚本的构造如下:

  9. 2、基本方法(Basic Recipes)

    学习目录:树莓派学习之路-GPIO Zero 官网地址:http://gpiozero.readthedocs.io/en/stable/recipes.html 环境:UbuntuMeta-16.0 ...

  10. github是什么,有什么用

    转载连接:https://blog.csdn.net/obkoro1/article/details/68066441 写在前面:关于github的文章我已经写了两篇了,关于github个人网站搭建和 ...