3876: [Ahoi2014]支线剧情

Time Limit: 10 Sec  Memory Limit: 256 MB
Submit: 484  Solved: 296
[Submit][Status][Discuss]

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

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

Source

By 佚名上传

【思路】

  有上下界的费用流。

  用最短路算法慢得飞起=-=,等会学一下zkw费用流。

【代码】

  1. /**************************************************************
  2. Problem: 3876
  3. User: hahalidaxin2
  4. Language: C++
  5. Result: Accepted
  6. Time:10640 ms
  7. Memory:1856 kb
  8. ****************************************************************/
  9.  
  10. #include<cstdio>
  11. #include<cstring>
  12. #include<queue>
  13. #include<vector>
  14. #define FOR(a,b,c) for(int a=(b);a<=(c);a++)
  15. using namespace std;
  16.  
  17. typedef long long LL ;
  18. const int maxn = +;
  19. const int INF = 1e9;
  20.  
  21. struct Edge{ int u,v,cap,flow,cost;
  22. };
  23.  
  24. struct MCMF {
  25. int n,m,s,t;
  26. int inq[maxn],a[maxn],d[maxn],p[maxn];
  27. vector<int> G[maxn];
  28. vector<Edge> es;
  29.  
  30. void init(int n) {
  31. this->n=n;
  32. es.clear();
  33. for(int i=;i<n;i++) G[i].clear();
  34. }
  35. void AddEdge(int u,int v,int cap,int cost) {
  36. es.push_back((Edge){u,v,cap,,cost});
  37. es.push_back((Edge){v,u,,,-cost});
  38. m=es.size();
  39. G[u].push_back(m-);
  40. G[v].push_back(m-);
  41. }
  42.  
  43. bool SPFA(int s,int t,int& flow,LL& cost) {
  44. for(int i=;i<n;i++) d[i]=INF;
  45. memset(inq,,sizeof(inq));
  46. d[s]=; inq[s]=; p[s]=; a[s]=INF;
  47. queue<int> q; q.push(s);
  48. while(!q.empty()) {
  49. int u=q.front(); q.pop(); inq[u]=;
  50. for(int i=;i<G[u].size();i++) {
  51. Edge& e=es[G[u][i]];
  52. int v=e.v;
  53. if(e.cap>e.flow && d[v]>d[u]+e.cost) {
  54. d[v]=d[u]+e.cost;
  55. p[v]=G[u][i];
  56. a[v]=min(a[u],e.cap-e.flow); //min(a[u],..)
  57. if(!inq[v]) { inq[v]=; q.push(v);
  58. }
  59. }
  60. }
  61. }
  62. if(d[t]==INF) return false;
  63. flow+=a[t] , cost += (LL) a[t]*d[t];
  64. for(int x=t; x!=s; x=es[p[x]].u) {
  65. es[p[x]].flow+=a[t]; es[p[x]^].flow-=a[t];
  66. }
  67. return true;
  68. }
  69. int Mincost(int s,int t,LL& cost) {
  70. int flow=; cost=;
  71. while(SPFA(s,t,flow,cost)) ;
  72. return flow;
  73. }
  74. } mc;
  75.  
  76. int n;
  77.  
  78. int main() {
  79. scanf("%d",&n);
  80. mc.init(n+);
  81. int s=,t=n+;
  82. mc.AddEdge(t,s,INF,);
  83. FOR(u,,n) {
  84. int m,v,c; scanf("%d",&m);
  85. if(u!=) mc.AddEdge(u,,INF,);
  86. mc.AddEdge(u,t,m,);
  87. FOR(j,,m) {
  88. scanf("%d%d",&v,&c);
  89. mc.AddEdge(u,v,INF,c);
  90. mc.AddEdge(s,v,,c);
  91. }
  92. }
  93. LL cost;
  94. mc.Mincost(s,t,cost);
  95. printf("%lld\n",cost);
  96. return ;
  97. }

最短路算法

【代码2】

  1. /**************************************************************
  2. Problem: 3876
  3. User: hahalidaxin2
  4. Language: C++
  5. Result: Accepted
  6. Time:1884 ms
  7. Memory:1852 kb
  8. ****************************************************************/
  9.  
  10. #include<cstdio>
  11. #include<cstring>
  12. #include<queue>
  13. #include<vector>
  14. #define FOR(a,b,c) for(int a=(b);a<=(c);a++)
  15. using namespace std;
  16.  
  17. typedef long long LL ;
  18. const int maxn = +;
  19. const int INF = 1e9;
  20.  
  21. struct Edge{ int u,v,cap,flow,cost;
  22. };
  23. struct zkw {
  24. int n,m,s,t;
  25. int vis[maxn],d[maxn];
  26. vector<int> G[maxn];
  27. vector<Edge> es;
  28.  
  29. void init(int n) {
  30. this->n=n;
  31. es.clear();
  32. for(int i=;i<n;i++) G[i].clear();
  33. }
  34. void AddEdge(int u,int v,int cap,int cost) {
  35. es.push_back((Edge){u,v,cap,,cost});
  36. es.push_back((Edge){v,u,,,-cost});
  37. m=es.size();
  38. G[u].push_back(m-);
  39. G[v].push_back(m-);
  40. }
  41. bool spfa() {
  42. memset(vis,,sizeof(vis));
  43. for(int i=;i<n;i++) d[i]=INF;
  44. queue<int> q;
  45. d[t]= , vis[t]= , q.push(t);
  46. while(!q.empty()) {
  47. int u=q.front(); q.pop() , vis[u]=;
  48. for(int i=;i<G[u].size();i++) {
  49. Edge& e=es[G[u][i]];
  50. int v=e.v;
  51. if(es[G[u][i]^].cap && d[v]>d[u]-e.cost) {
  52. d[v]=d[u]-e.cost;
  53. if(!vis[v]) {
  54. vis[v]=;
  55. q.push(v);
  56. }
  57. }
  58. }
  59. }
  60. return d[s]!=INF;
  61. }
  62. int dfs(int u,int a,LL& cost) {
  63. vis[u]=; if(u==t) return a;
  64. int used=,w;
  65. for(int i=;i<G[u].size();i++) {
  66. Edge& e=es[G[u][i]];
  67. int v=e.v;
  68. if(d[u]-e.cost==d[v] && !vis[v] && e.cap) {
  69. w=dfs(v,min(a-used,e.cap),cost);
  70. cost+=w*e.cost;
  71. e.cap-=w , es[G[u][i]^].cap+=w;
  72. used+=w; if(used==a) return a;
  73. }
  74. }
  75. return used;
  76. }
  77. int Mincost(int s,int t,LL& cost) {
  78. this->s=s , this->t=t;
  79. int flow=; cost=;
  80. while(spfa()) {
  81. vis[t]=;
  82. while(vis[t]) {
  83. memset(vis,,sizeof(vis));
  84. flow+=dfs(s,INF,cost);
  85. }
  86. }
  87. return flow;
  88. }
  89. } mc;
  90.  
  91. int n;
  92.  
  93. int main() {
  94. scanf("%d",&n);
  95. mc.init(n+);
  96. int s=,t=n+;
  97. mc.AddEdge(t,s,INF,);
  98. FOR(u,,n) {
  99. int m,v,c; scanf("%d",&m);
  100. if(u!=) mc.AddEdge(u,,INF,);
  101. mc.AddEdge(u,t,m,);
  102. FOR(j,,m) {
  103. scanf("%d%d",&v,&c);
  104. mc.AddEdge(u,v,INF,c);
  105. mc.AddEdge(s,v,,c);
  106. }
  107. }
  108. LL cost;
  109. mc.Mincost(s,t,cost);
  110. printf("%lld\n",cost);
  111. return ;
  112. }

zkw费用流

  跑稠密图的话,zkw的优化效果还是比较明显的。

UPD.16/4/8

按理说有上下界的处理和跑网络流的那几道题是一样的,现在没时间测了,该上车了。

bzoj 3876 [Ahoi2014]支线剧情(有上下界的最小费用流)的更多相关文章

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

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

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

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

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

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

  4. 【BZOJ3876】[Ahoi2014]支线剧情 有上下界费用流

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

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

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

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

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

  7. 【BZOJ-3876】支线剧情 有上下界的网络流(有下界有源有汇最小费用最大流)

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

  8. BZOJ3876[Ahoi2014&Jsoi2014]支线剧情——有上下界的最小费用最大流

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

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

    ---题面--- 题解: 第一眼费用流,,然后想了好久怎么建图,,,最后发现是最小费用可行流的板子题.... 其实还没有很懂这个算法,所以这里只是摆一下步骤,以后再补理解吧. 首先一个思路就是转换图, ...

随机推荐

  1. 内网映射到公网工具 --- ngrok

    ngrok可以将内网映射到公网上,这样就可以在公网上访问你的网络服务. 该工具通常在进行app开发和微信开发时比较有用,这样就可避免在公网服务器上单独部署项目,通过映射,直接连接本地服务即可进行开发. ...

  2. SGU 197.Nice Patterns Strike Back

    时间限制:0.5s 空间限制:6M 题意: 给出长n(n<=10^100)和宽m(m<=5)的地面,铺上黑色和白色的地板,使得没有任意一个2*2大小的地面铺同种颜色的方案数是多少. Sol ...

  3. Python学习 - 使用BeautifulSoup来解析网页一:基础入门

    写技术博客主要就是总结和交流的,如果文章用错,请指正啊! 以前一直在使用SGMLParser,这个太费时间和精力了,现在为了毕业设计,改用BeautifulSoup来实现HTML页面的解析工作的. 一 ...

  4. jquery获取元素的所有宽高(包括内边距和外边距)

    width() - 返回元素的宽度.height() - 返回元素的高度.innerWidth() 方法返回元素的宽度(包括内边距).                    innerHeight() ...

  5. 安装search everything中文语言包

    Everything 作为很多人的必备工具,特写这篇文章,一方面让想使用国外优秀软件的英语小白有一段过渡期,另一方面也为自己整理下资料.当然,这个可不是不学好英语的正当理由. 步骤: 1. 下载好se ...

  6. frame,bounds,center-三者的含义

    frame与bounds的区别比较 frame,bounds,center-三者的含义 偶然觉的,这三个属性有时候定位的时候,需要用.于是就来搞清楚,到底frame,bounds,center 这三个 ...

  7. List of XML and HTML character entity references

    A character entity reference refers to the content of a named entity. An entity declaration is creat ...

  8. BZOJ 3570 动物园

    Description 近日,园长发现动物园中好吃懒做的动物越来越多了.例如企鹅,只会卖萌向游客要吃的.为了整治动物园的不良风气,让动物们凭自己的真才实学向游客要吃的,园长决定开设算法班,让动物们学习 ...

  9. 源代码安装GIT

    参考URL:http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=25150840&id=4250659 若是条件允许,从源代 ...

  10. JavaScript encodeURI() 函数

    encodeURI() 函数可把字符串作为 URI 进行编码. -------------------------------------------------------------------- ...