BZOJ 3876 支线剧情 | 有下界费用流

题意

这题题面搞得我看了半天没看懂……是这样的,原题中的“剧情”指的是边,“剧情点”指的才是点。

题面翻译过来大概是这样:

有一个DAG,每次从1号点出发,走过一条路径,再瞬移回1号点。问:想要遍历所有的边,至少要走多少路程(瞬移回1号点不算路程)。

题解

我们用有上下界费用流的模型,建个图:

  1. 原图中的每条边,流量范围是\([1, +\infty]\),表示至少走一次,可以走无限次,这条边的费用就是边权。
  2. 原图中的每个点(除1号点外)向1号点连一条边,流量范围是\([0, +\infty]\),费用为0,表示任意节点随时可以回到1号节点。

在这个图上求一个最小费用最小流即可。

那么我们再用上下界网络流的套路给这个图改成正常的有源汇网络流:

  1. 对于原图中的每条边\(u \to v\)(边权为\(w\)),建边\((u, v, +\infty , w), (S, v, 1, w)\);
  2. 对于每个出度为\(t\)的点\(u\),建边\((u, T, t, 0)\);
  3. 对于每个非1的点\(u\),建边\((u, 1, +\infty, 0)\)。
  1. #include <cstdio>
  2. #include <cmath>
  3. #include <cstring>
  4. #include <algorithm>
  5. #include <queue>
  6. using namespace std;
  7. typedef long long ll;
  8. #define enter putchar('\n')
  9. #define space putchar(' ')
  10. template <class T>
  11. void read(T &x){
  12. char c;
  13. bool op = 0;
  14. while(c = getchar(), c > '9' || c < '0')
  15. if(c == '-') op = 1;
  16. x = c - '0';
  17. while(c = getchar(), c >= '0' && c <= '9')
  18. x = x * 10 + c - '0';
  19. if(op) x = -x;
  20. }
  21. template <class T>
  22. void write(T x){
  23. if(x < 0) putchar('-'), x = -x;
  24. if(x >= 10) write(x / 10);
  25. putchar('0' + x % 10);
  26. }
  27. const int N = 305, M = 2000005, INF = 0x3f3f3f3f;
  28. int n, src, des;
  29. int ecnt = 1, adj[N], pre[N], dis[N], go[M], nxt[M], cap[M], cost[M];
  30. queue <int> que;
  31. bool inq[N];
  32. void ADD(int u, int v, int _cap, int _cost){
  33. go[++ecnt] = v;
  34. nxt[ecnt] = adj[u];
  35. adj[u] = ecnt;
  36. cap[ecnt] = _cap;
  37. cost[ecnt] = _cost;
  38. }
  39. void add(int u, int v, int _cap, int _cost){
  40. ADD(u, v, _cap, _cost);
  41. ADD(v, u, 0, -_cost);
  42. }
  43. bool spfa(){
  44. for(int i = 1; i <= des; i++)
  45. dis[i] = INF, pre[i] = 0;
  46. dis[src] = 0, que.push(src), inq[src] = 1;
  47. while(!que.empty()){
  48. int u = que.front();
  49. que.pop(), inq[u] = 0;
  50. for(int e = adj[u], v; e; e = nxt[e])
  51. if(cap[e] && dis[v = go[e]] > dis[u] + cost[e]){
  52. dis[v] = dis[u] + cost[e], pre[v] = e;
  53. if(!inq[v]) que.push(v), inq[v] = 1;
  54. }
  55. }
  56. return pre[des] != 0;
  57. }
  58. int mcmf(){
  59. int ret = 0;
  60. while(spfa()){
  61. int flow = INF;
  62. for(int e = pre[des]; e; e = pre[go[e ^ 1]])
  63. flow = min(flow, cap[e]);
  64. for(int e = pre[des]; e; e = pre[go[e ^ 1]])
  65. cap[e] -= flow, cap[e ^ 1] += flow;
  66. ret += flow * dis[des];
  67. }
  68. return ret;
  69. }
  70. int main(){
  71. read(n), src = n + 1, des = src + 1;
  72. for(int u = 1, t; u <= n; u++){
  73. read(t);
  74. for(int i = 1, v, w; i <= t; i++)
  75. read(v), read(w), add(src, v, 1, w), add(u, v, INF, w);
  76. add(u, des, t, 0);
  77. if(u != 1) add(u, 1, INF, 0);
  78. }
  79. write(mcmf()), enter;
  80. return 0;
  81. }

BZOJ 3876 支线剧情 | 有下界费用流的更多相关文章

  1. BZOJ 3876: [Ahoi2014]支线剧情 [上下界费用流]

    3876: [Ahoi2014]支线剧情 题意:每次只能从1开始,每条边至少经过一次,有边权,求最小花费 裸上下界费用流...每条边下界为1就行了 注意要加上下界*边权 #include <io ...

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

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

  3. [bzoj3876][AHOI2014]支线剧情——上下界费用流

    题目 传送门 题解 建立s和t,然后s向1连下限0上限inf费用0的边,除1外所有节点向t连下限0上限inf费用0的边,对于每条边下限为1上限为inf费用为经过费用,然后我们只有做上下界网络流构出新图 ...

  4. 刷题总结——支线剧情(bzoj3876费用流)

    题目: [故事背景] 宅男JYY非常喜欢玩RPG游戏,比如仙剑,轩辕剑等等.不过JYY喜欢的并不是战斗场景,而是类似电视剧一般的充满恩怨情仇的剧情.这些游戏往往 都有很多的支线剧情,现在JYY想花费最 ...

  5. BZOJ 3876 支线剧情(有上下界的无源汇最小费用可行流)

    3876: [Ahoi2014]支线剧情 Time Limit: 10 Sec  Memory Limit: 256 MB Submit: 1783  Solved: 1079 [Submit][St ...

  6. BZOJ 3876 支线剧情

    支线剧情 [故事背景] 宅男JYY非常喜欢玩RPG游戏,比如仙剑,轩辕剑等等.不过JYY喜欢的并不是战斗场景,而是类似电视剧一般的充满恩怨情仇的剧情.这些游戏往往都有很多的支线剧情,现在JYY想花费最 ...

  7. BZOJ 3876 支线剧情 有源汇有上下界最小费用可行流

    题意: 给定一张拓扑图,每条边有边权,每次只能从第一个点出发沿着拓扑图走一条路径,求遍历所有边所需要的最小边权和 分析: 这道题乍一看,可能会想到什么最小链覆盖之类的,但是仔细一想,会发现不行,一是因 ...

  8. BZOJ 4108: [Wf2015]Catering [上下界费用流]

    4108: [Wf2015]Catering 题意:有一家装备出租公司收到了按照时间顺序排列的n个请求. 这家公司有k个搬运工.每个搬运工可以搬着一套装备按时间顺序去满足一些请求.一个搬运工从第i个请 ...

  9. BZOJ 4213 贪吃蛇 上下界费用流 网络流

    https://darkbzoj.cf/problem/4213 https://www.cnblogs.com/DaD3zZ-Beyonder/p/5733326.html 题目描述 dbzoj又崩 ...

随机推荐

  1. 【LeetCode92】Reverse Linked List II★★

    题目描述: 解题思路: 题目大意:给定一个链表,反转第m到第n个结点部分,m.n满足1 ≤ m ≤ n ≤ length of list. 解题思路参照LeetCode206题,用迭代法,不过要注意以 ...

  2. 20155216 Exp5 MSF基础应用

    Exp5 MSF基础应用 基础问题回答 1.用自己的话解释什么是exploit,payload,encode? exploit : Exploit的英文意思就是利用,在做攻击时,通常称为漏洞利用. 一 ...

  3. 20155237 《JAVA程序设计》实验三(敏捷开发与XP实践)实验报告

    20155237 <JAVA程序设计>实验三(敏捷开发与XP实践)实验报告 实验内容 敏捷开发与XP实践 XP基础 XP核心实践 相关工具 实验要求 1.没有Linux基础的同学建议先学习 ...

  4. 2017-2018-2 20155333 《网络对抗技术》 Exp1 PC平台逆向破解

    2017-2018-2 20155333 <网络对抗技术> Exp1 PC平台逆向破解 1. 逆向及Bof基础实践说明 1.1 实践目标 本次实践的对象是一个名为pwn1的linux可执行 ...

  5. SCC的奇葩算法——Kosaraju

    不会Tarjan,难道就不能与邪恶的SCC作斗争了吗? 祭出Kosaraju. 一些变量名的意义: a[N] 原图的vector存储 b[N] 原图的所有边反向vector存储 s dfs得出的拓扑序 ...

  6. Inno Setup脚本

    某天夜晚一场狂风暴雨,由于办公室座位旁的窗户没关,笔记本电脑泡了一夜水,无法开机,无奈送修,里面的大量资料也不知道会不会丢失. is的脚本只有重新写了,重新研究了一下检测程序是否正在运行的判断方法,另 ...

  7. Golang Context 详细介绍

    Golang context 本文包含对context实现上的分析和使用方式,分析部分源码讲解比价多,可能会比较枯燥,读者可以直接跳过去阅读使用部分. ps: 作者本着开源分享的精神撰写本篇文章,如果 ...

  8. PAT甲题题解-1106. Lowest Price in Supply Chain (25)-(dfs计算树的最小层数)

    统计树的最小层数以及位于该层数上的叶子节点个数即可. 代码里建树我用了邻接链表的存储方式——链式前向星,不了解的可以参考,非常好用: http://www.cnblogs.com/chenxiwenr ...

  9. Daily Scrumming* 2015.12.15(Day 7)

    一.团队scrum meeting照片 二.成员工作总结 姓名 任务ID 迁入记录 江昊 任务1036 https://github.com/buaaclubs-team/temp-front/com ...

  10. 20135234mqy-——信息安全系统设计基础第十四周学习总结

    第九章 虚拟存储器 主要作用: 将主存看作是一个存储在磁盘上的地址空间的高速缓存,在主存中只保护活动的区域,并根据需要在磁盘和主存之间来回传送数据: 为每个进程提供了一致的地址空间,从而简化了存储器管 ...