3876: [Ahoi2014]支线剧情

题目连接:

http://www.lydsy.com/JudgeOnline/problem.php?id=3876

Description

【故事背景】

宅男JYY非常喜欢玩RPG游戏,比如仙剑,轩辕剑等等。不过JYY喜欢的并不是战斗场景,而是类似电视剧一般的充满恩怨情仇的剧情。这些游戏往往

都有很多的支线剧情,现在JYY想花费最少的时间看完所有的支线剧情。

【问题描述】

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

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

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

Input

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

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

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

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

Output

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

Sample Input

6

2 2 1 3 2

2 4 3 5 4

2 5 5 6 6

0

0

0

Sample Output

24

Hint

题意

给你一个拓扑图,你每次可以选择走一条从1开始的路线。

每条边有边权

问你花费最少,经过所有的边,问你的花费是多少。

题解

画一个比较复杂的图,随便推一推就感觉是网络流了。

然后发现是带下界的网络流,这样一下这道题就挺傻逼的了。

对于一条边(x,y,z)表示从x到y,费用为z

那么建图:

addedge(S,y,1,z)表示至少经过一次

addedge(x,y,inf,z)随便经过

addedge(x,1,inf,0)回到1点

addedge(x,T,inf,0)随时停止。

然后跑一遍费用流就好了

代码

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. const int MAXN = 1000;
  4. const int MAXM = 50000;
  5. const int INF = 0x3f3f3f3f;
  6. struct Edge
  7. {
  8. int to, next, cap, flow, cost;
  9. int x, y;
  10. } edge[MAXM],HH[MAXN],MM[MAXN];
  11. int head[MAXN],tol;
  12. int pre[MAXN],dis[MAXN];
  13. bool vis[MAXN];
  14. int N, M;
  15. char map[MAXN][MAXN];
  16. void init()
  17. {
  18. N = MAXN;
  19. tol = 0;
  20. memset(head, -1, sizeof(head));
  21. }
  22. void addedge(int u, int v, int cap, int cost)//左端点,右端点,容量,花费
  23. {
  24. edge[tol]. to = v;
  25. edge[tol]. cap = cap;
  26. edge[tol]. cost = cost;
  27. edge[tol]. flow = 0;
  28. edge[tol]. next = head[u];
  29. head[u] = tol++;
  30. edge[tol]. to = u;
  31. edge[tol]. cap = 0;
  32. edge[tol]. cost = -cost;
  33. edge[tol]. flow = 0;
  34. edge[tol]. next = head[v];
  35. head[v] = tol++;
  36. }
  37. bool spfa(int s, int t)
  38. {
  39. queue<int>q;
  40. for(int i = 0; i < N; i++)
  41. {
  42. dis[i] = INF;
  43. vis[i] = false;
  44. pre[i] = -1;
  45. }
  46. dis[s] = 0;
  47. vis[s] = true;
  48. q.push(s);
  49. while(!q.empty())
  50. {
  51. int u = q.front();
  52. q.pop();
  53. vis[u] = false;
  54. for(int i = head[u]; i != -1; i = edge[i]. next)
  55. {
  56. int v = edge[i]. to;
  57. if(edge[i]. cap > edge[i]. flow &&
  58. dis[v] > dis[u] + edge[i]. cost )
  59. {
  60. dis[v] = dis[u] + edge[i]. cost;
  61. pre[v] = i;
  62. if(!vis[v])
  63. {
  64. vis[v] = true;
  65. q.push(v);
  66. }
  67. }
  68. }
  69. }
  70. if(pre[t] == -1) return false;
  71. else return true;
  72. }
  73. //返回的是最大流, cost存的是最小费用
  74. int minCostMaxflow(int s, int t, int &cost)
  75. {
  76. int flow = 0;
  77. cost = 0;
  78. while(spfa(s,t))
  79. {
  80. int Min = INF;
  81. for(int i = pre[t]; i != -1; i = pre[edge[i^1]. to])
  82. {
  83. if(Min > edge[i]. cap - edge[i]. flow)
  84. Min = edge[i]. cap - edge[i]. flow;
  85. }
  86. for(int i = pre[t]; i != -1; i = pre[edge[i^1]. to])
  87. {
  88. edge[i]. flow += Min;
  89. edge[i^1]. flow -= Min;
  90. cost += edge[i]. cost * Min;
  91. }
  92. flow += Min;
  93. }
  94. return flow;
  95. }
  96. int main(){
  97. int n;init();
  98. scanf("%d",&n);
  99. int S=0,T=n+1;
  100. for(int i=1;i<=n;i++){
  101. int c;scanf("%d",&c);
  102. addedge(i,T,c,0);
  103. if(i!=1)addedge(i,1,INF,0);
  104. for(int j=1;j<=c;j++){
  105. int a,b;
  106. scanf("%d%d",&a,&b);
  107. addedge(S,a,1,b);
  108. addedge(i,a,INF,b);
  109. }
  110. }
  111. int ans1=0,ans2=0;
  112. ans1=minCostMaxflow(S,T,ans2);
  113. cout<<ans2<<endl;
  114. }

BZOJ 3876: [Ahoi2014]支线剧情 带下界的费用流的更多相关文章

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

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

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

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

  3. 【有源汇上下界费用流】BZOJ 3876 [Ahoi2014]支线剧情

    题目链接: http://www.lydsy.com:808/JudgeOnline/problem.php?id=3876 题目大意: 给定一张拓扑图(有向无环图),每条边有边权,每次只能从第一个点 ...

  4. bzoj 3876: [Ahoi2014]支线剧情

    就是加一个1的下界就好了. #include<bits/stdc++.h> #define N 100005 #define LL long long #define inf 0x3f3f ...

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

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

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

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

  7. BZOJ 3876 [Ahoi2014&Jsoi2014]支线剧情

    题解: 带下界的费用流 对于x->y边权为z Addedge(x,t,1,0) Addedge(s,y,1,z) Addedge(x,y,inf,0) 然后对每个点Addedge(i,1,inf ...

  8. [Ahoi2014]支线剧情[无源汇有下界最小费用可行流]

    3876: [Ahoi2014]支线剧情 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 1538  Solved: 940[Submit][Statu ...

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

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

随机推荐

  1. bash脚本里su命令执行

    俩种方法 1.可以使用 <<EOF 参数实现. 脚本内容:cat test.sh代码如下: #!/bin/bashsu - test <<EOFpwd;exit;EOF 2.当 ...

  2. Task多线程进行多进程

    using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using Sys ...

  3. easyui表单提交验证form

    方式一,不需要考虑jquery.easyui.min.js版本 <script> $(function () { //针对 设置 novalidate:true $('.validateb ...

  4. asp.net mvc发送邮件

    参考文献: 第一篇:http://www.cnblogs.com/qinpengming/archive/2011/06/08/2075040.html 第二篇:http://www.cnblogs. ...

  5. bzoj 1607 Patting Heads 轻拍牛头

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1607 题解: 题目似乎出错,应为“同时拍打所有所持纸条上的数字能被此牛所持纸条上的数字整除 ...

  6. python网络编程--线程GIL(全局解释器锁)

    一:什么是GIL 在CPython,全局解释器锁,或GIL,是一个互斥体防止多个本地线程执行同时修改同一个代码.这把锁是必要的主要是因为当前的内存管理不是线程安全的.(然而,由于GIL存在,其他特性已 ...

  7. python网络编程-动态导入和断言

    一:动态导入importlib 在程序运行的过程中,根据变量或者配置动态的决定导入哪个模块,可以使用模块importlib importlib使用示例 二:断言assert 如果接下来的程序依赖于前面 ...

  8. python基础--re模块

    常用正则表达式符号 '.' 默认匹配除\n之外的任意一个字符,若指定flag DOTALL,则匹配任意字符,包括换行 '^' 匹配字符开头,若指定flags MULTILINE,这种也可以匹配上(r& ...

  9. python图片处理(二)

    python中图像处理有pillow和skimage 图像中一般有个RGBA值,RGB顾名思义就是红绿蓝值,A表示alpha表示是透明度. from PIL import ImageColor pri ...

  10. Elasticsearch的相关知识

    Elasticsearch的备份和恢复 http://keenwon.com/1393.html ETL kettle 数据转成json 发送POST请求 http://blog.csdn.net/a ...