支线剧情

【故事背景】

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

【问题描述】

JYY现在所玩的RPG游戏中,一共有N个剧情点,由1到N编号,第i个剧情点可以根据JYY的不同的选择,而经过不同的支线剧情,前往Ki种不同的新的剧情点。当然如果为0,则说明i号剧情点是游戏的一个结局了。

JYY观看一个支线剧情需要一定的时间。JYY一开始处在1号剧情点,也就是游戏的开始。显然任何一个剧情点都是从1号剧情点可达的。此外,随着游戏的进行,剧情是不可逆的。所以游戏保证从任意剧情点出发,都不能再回到这个剧情点。由于JYY过度使用修改器,导致游戏的“存档”和“读档”功能损坏了,

所以JYY要想回到之前的剧情点,唯一的方法就是退出当前游戏,并开始新的游戏,也就是回到1号剧情点。JYY可以在任何时刻退出游戏并重新开始。不断开始新的游戏重复观看已经看过的剧情是很痛苦,JYY希望花费最少的时间,看完所有不同的支线剧情。

【输入格式】

输入一行包含一个正整数N。

接下来N行,第i行为i号剧情点的信息;

第一个整数为,接下来个整数对,Bij和Tij,表示从剧情点i可以前往剧

情点,并且观看这段支线剧情需要花费的时间。

【输出格式】

输出一行包含一个整数,表示JYY看完所有支线剧情所需要的最少时间。

【样例输入】

6
2 2 1 3 2
2 4 3 5 4
2 5 5 6 6
0
0
0

【样例输出】

24

【样例解释】

JYY需要重新开始3次游戏,加上一开始的一次游戏,4次游戏的进程是

1->2->4,1->2->5,1->3->5和1->3->6。

对于100%的数据满足N<=300,0<=Ki<=50,1<=Tij<=300,Sigma(Ki)<=5000


题解:

题意就是要求走完所有边所需的最小时间(费用)

相当于有上下界无源汇可行最小费用流

那么就把题目中给定的边下界设为 1

重新开始就从每一个点连向点 1 就好了

具体见图可看代码

对于超级源与超级汇的连边也一起连在里面了

  1. #include<cmath>
  2. #include<cstdio>
  3. #include<cstdlib>
  4. #include<cstring>
  5. #include<iostream>
  6. #include<algorithm>
  7. using namespace std;
  8. const int maxn = 1e3 + ;
  9. const int maxm = 3e4 + ;
  10. const int inf = 1e9 + ;
  11. int n;
  12. int s, t, nors, nort, sups, supt;
  13. int du[maxn];
  14. int len;
  15. int nex[maxm], fir[maxn], ver[maxm], con[maxm], val[maxm];
  16. bool vis[maxn];
  17. int que[maxm << ], dis[maxn];
  18. int ans;
  19. inline void Scan(int &x)
  20. {
  21. char c;
  22. bool o = false;
  23. while(!isdigit(c = getchar())) o = (c != '-') ? o : true;
  24. x = c - '';
  25. while(isdigit(c = getchar())) x = x * + c - '';
  26. if(o) x = -x;
  27. }
  28. inline void Add(int x, int y, int c, int w)
  29. {
  30. nex[++len] = fir[x];
  31. fir[x] = len;
  32. ver[len] = y;
  33. con[len] = c;
  34. val[len] = w;
  35. }
  36. inline void Ins(int x, int y, int c, int w)
  37. {
  38. Add(x, y, c, w);
  39. Add(y, x, , -w);
  40. }
  41. inline void Sup(int x, int y, int l, int r, int w)
  42. {
  43. if(l) du[x] -= l, du[y] += l;
  44. if(l != r) Ins(x, y, r - l, w);
  45. }
  46. inline bool Spfa()
  47. {
  48. int head = , tail = ;
  49. for(int i = ; i <= supt; ++i)
  50. dis[i] = inf, vis[i] = false;
  51. que[tail] = s;
  52. dis[s] = ;
  53. vis[s] = true;
  54. while(head < tail)
  55. {
  56. int u = que[++head];
  57. for(int i = fir[u]; i; i = nex[i])
  58. {
  59. if(!con[i]) continue;
  60. int v = ver[i];
  61. if(dis[v] > dis[u] + val[i])
  62. {
  63. dis[v] = dis[u] + val[i];
  64. if(!vis[v])
  65. {
  66. vis[v] = true;
  67. que[++tail] = v;
  68. }
  69. }
  70. }
  71. vis[u] = false;
  72. }
  73. return dis[t] < inf;
  74. }
  75. int Dinic(int u, int f)
  76. {
  77. vis[u] = true;
  78. if(u == t) return f;
  79. int g = f;
  80. for(int i = fir[u]; i; i = nex[i])
  81. {
  82. if(!con[i]) continue;
  83. int v = ver[i];
  84. if(vis[v] || dis[v] != dis[u] + val[i]) continue;
  85. int h = Dinic(v, min(con[i], g));
  86. if(h)
  87. {
  88. con[i] -= h;
  89. con[i ^ ] += h;
  90. g -= h;
  91. ans += h * val[i];
  92. if(!g) return f;
  93. }
  94. }
  95. return f - g;
  96. }
  97. inline int Flow(int x, int y)
  98. {
  99. s = x, t = y, ans = ;
  100. while(Spfa()) Dinic(s, inf);
  101. return ans;
  102. }
  103. inline void Init()
  104. {
  105. len = ;
  106. nors = n << | ;
  107. nort = nors + ;
  108. sups = nort + ;
  109. supt = sups + ;
  110. }
  111. int main()
  112. {
  113. Scan(n);
  114. int m, x, t;
  115. Init();
  116. for(int i = ; i <= n; ++i)
  117. {
  118. Scan(m);
  119. Ins(i, supt, m, );
  120. while(m--)
  121. {
  122. Scan(x), Scan(t);
  123. Sup(i, x, , inf, t);
  124. Ins(sups, x, , t);
  125. }
  126. if(i != ) Ins(i, , inf, );
  127. }
  128. printf("%d", Flow(sups, supt));
  129. }

BZOJ 3876 支线剧情的更多相关文章

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

    BZOJ 3876 支线剧情 | 有下界费用流 题意 这题题面搞得我看了半天没看懂--是这样的,原题中的"剧情"指的是边,"剧情点"指的才是点. 题面翻译过来大 ...

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

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

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

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

  4. bzoj 3876 [Ahoi2014]支线剧情(有上下界的最小费用流)

    3876: [Ahoi2014]支线剧情 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 484  Solved: 296[Submit][Status ...

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

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

  6. BZOJ 3876: [Ahoi2014]支线剧情 带下界的费用流

    3876: [Ahoi2014]支线剧情 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=3876 Description [故事背景] 宅 ...

  7. BZOJ 3876:支线剧情(有下界最小费用最大流)

    3876: [Ahoi2014]支线剧情 Description [故事背景]宅男JYY非常喜欢玩RPG游戏,比如仙剑,轩辕剑等等.不过JYY喜欢的并不是战斗场景,而是类似电视剧一般的充满恩怨情仇的剧 ...

  8. BZOJ 3876 【AHOI2014】 支线剧情

    题目链接:支线剧情 这道题就是一道裸裸的上下界网络流……只不过这道题边带了权,那么建出图之后跑费用流即可. 首先需要新建超级源\(S\)和超级汇\(T\).对于这道题,对于一条边\((u,v,z)\) ...

  9. 支线剧情(bzoj 3876)

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

随机推荐

  1. 2018.11.3 Nescafe18 T1 七夕祭

    题目 背景 七夕节因牛郎织女的传说而被扣上了「情人节」的帽子.于是 TYVJ 今年举办了一次线下七夕祭.Vani 同学今年成功邀请到了 cl 同学陪他来共度七夕,于是他们决定去 TYVJ七夕祭游玩. ...

  2. Mysql 查询出某列字段 被包含于 条件数据中

    我们通常是使用  某条件  是否包含于 某列中   ,简单点 就是:select * from 表名 where  字段名 like '%条件数据%'; 现在说下   某列 被包含于 条件数据中 接下 ...

  3. 二十、Mysql 连接的使用

    Mysql 连接的使用 在前几章节中,我们已经学会了如何在一张表中读取数据,这是相对简单的,但是在真正的应用中经常需要从多个数据表中读取数据. 本章节我们将向大家介绍如何使用 MySQL 的 JOIN ...

  4. HashMap 排序

    本文章,摘抄自:2018黑马程序最新面试题汇总 已知一个 HashMap<Integer,User>集合, User 有 name(String)和 age(int)属性.请写一个方法实现 ...

  5. js测试密码的强度

    测试密码的强度.js //网站也会根据输入密码的字符特点给出相应的提示,如密码过短.强度差.强度中等.强度强等. //这又是怎么实现的呢?看下面代码: <input type="pas ...

  6. Vue钩子函数生命周期实例详解

    vue生命周期简介 Vue实例有一个完整的生命周期,也就是从开始创建.初始化数据.编译模板.挂载Dom.渲染→更新→渲染.卸载等一系列过程,我们称这是Vue的生命周期.通俗说就是Vue实例从创建到销毁 ...

  7. Python编写一个程序求2的次方

    #!/usr/bin/env python3 #-*- coding:utf-8 -*- #":"冒号后面为对参数注释,"->"为对整个函数注释 def ...

  8. 获取获取docker的文件

    1.docke实例内mysql 导出文件 mysql -h yourhost -P yourport -u user -p dbname -e "select * from employee ...

  9. windows服务自动备份数据库

    最近写了几个windows服务用于自动备份与删除数据: services代码如下: public partial class Service1 : ServiceBase { public Servi ...

  10. 【Search In Rotated Sorted Array】cpp

    题目: Suppose a sorted array is rotated at some pivot unknown to you beforehand. (i.e., 0 1 2 4 5 6 7  ...