题目背景

none!

题目描述

由于人类对自然资源的消耗,人们意识到大约在 2300 年之后,地球就不能再居住了。于是在月球上建立了新的绿地,以便在需要时移民。令人意想不到的是,2177 年冬由于未知的原因,地球环境发生了连锁崩溃,人类必须在最短的时间内迁往月球。

现有 n 个太空站位于地球与月球之间,且有 m 艘公共交通太空船在其间来回穿梭。每个太空站可容纳无限多的人,而每艘太空船 i 只可容纳 H[i]个人。每艘太空船将周期性地停靠一系列的太空站,例如:(1,3,4)表示该太空船将周期性地停靠太空站 134134134…。每一艘太空船从一个太空站驶往任一太空站耗时均为 1。人们只能在太空船停靠太空站(或月球、地球)时上、下船。

初始时所有人全在地球上,太空船全在初始站。试设计一个算法,找出让所有人尽快地全部转移到月球上的运输方案。

对于给定的太空船的信息,找到让所有人尽快地全部转移到月球上的运输方案。

输入输出格式

输入格式:

第 1 行有 3 个正整数 n(太空站个数),m(太空船个数)和 k(需要运送的地球上的人的个数)。其中 n<=13 m<=20, 1<=k<=50。

接下来的 m 行给出太空船的信息。第 i+1 行说明太空船 pi。第 1 个数表示 pi 可容纳的人数 Hpi;第 2 个数表示 pi 一个周期停靠的太空站个数 r,1<=r<=n+2;随后 r 个数是停靠的太空站的编号(Si1,Si2,…,Sir),地球用 0 表示,月球用-1 表示。

时刻 0 时,所有太空船都在初始站,然后开始运行。在时刻 1,2,3…等正点时刻各艘太空船停靠相应的太空站。人只有在 0,1,2…等正点时刻才能上下太空船。

输出格式:

程序运行结束时,将全部人员安全转移所需的时间输出。如果问题

无解,则输出 0。

解题思路:

假如说告诉你多少天,问转移人口,那是不是会好一些,

按时间分层,不同层相同点间按照时间方向建$inf$的边,

跑一边最大流,源点是0时刻的地球,汇点是T时刻的月球。

最大流就是人口。

所以枚举判断好了。

代码:

  1. #include<queue>
  2. #include<cstdio>
  3. #include<vector>
  4. #include<cstring>
  5. #include<algorithm>
  6. const int oo=0x3f3f3f3f;
  7. struct pnt{
  8. int hd;
  9. int lyr;
  10. int now;
  11. }p[];
  12. struct ent{
  13. int twd;
  14. int lst;
  15. int vls;
  16. }e[];
  17. int cnt;
  18. int n,m,k;
  19. int s,t;
  20. int size;
  21. int H[];
  22. int fa[];
  23. std::queue<int>Q;
  24. std::vector<int>st[];
  25. void ade(int f,int t,int v)
  26. {
  27. cnt++;
  28. e[cnt].twd=t;
  29. e[cnt].vls=v;
  30. e[cnt].lst=p[f].hd;
  31. p[f].hd=cnt;
  32. return ;
  33. }
  34. bool Bfs(void)
  35. {
  36. while(!Q.empty())
  37. Q.pop();
  38. for(int i=;i<=size;i++)
  39. p[i].lyr=;
  40. p[s].lyr=;
  41. Q.push(s);
  42. while(!Q.empty())
  43. {
  44. int x=Q.front();
  45. Q.pop();
  46. for(int i=p[x].hd;i;i=e[i].lst)
  47. {
  48. int to=e[i].twd;
  49. if(p[to].lyr==&&e[i].vls>)
  50. {
  51. p[to].lyr=p[x].lyr+;
  52. if(to==t)
  53. return true;
  54. Q.push(to);
  55. }
  56. }
  57. }
  58. return false;
  59. }
  60. int Dfs(int x,int fll)
  61. {
  62. if(x==t)
  63. return fll;
  64. for(int& i=p[x].now;i;i=e[i].lst)
  65. {
  66. int to=e[i].twd;
  67. if(p[to].lyr==p[x].lyr+&&e[i].vls>)
  68. {
  69. int ans=Dfs(to,std::min(fll,e[i].vls));
  70. if(ans>)
  71. {
  72. e[i].vls-=ans;
  73. e[((i-)^)+].vls+=ans;
  74. return ans;
  75. }
  76. }
  77. }
  78. return ;
  79. }
  80. int Dinic(void)
  81. {
  82. int ans=;
  83. while(Bfs())
  84. {
  85. for(int i=;i<=size;i++)
  86. p[i].now=p[i].hd;
  87. int dlt;
  88. while(dlt=Dfs(s,oo))
  89. ans+=dlt;
  90. }
  91. return ans;
  92. }
  93. int finf(int x)
  94. {
  95. return fa[x]==x?x:fa[x]=finf(fa[x]);
  96. }
  97. int main()
  98. {
  99. // freopen("a.in","r",stdin);
  100. scanf("%d%d%d",&n,&m,&k);
  101. for(int i=;i<=n+m+;i++)fa[i]=i;
  102. for(int i=;i<=m;i++)
  103. {
  104. scanf("%d",&H[i]);
  105. int tmp;
  106. scanf("%d",&tmp);
  107. for(int j=;j<=tmp;j++)
  108. {
  109. int tl;
  110. scanf("%d",&tl);
  111. if(tl==)tl=n+;
  112. if(tl==-)tl=n+;
  113. st[i].push_back(tl);
  114. int f1=finf(tl);
  115. int f2=finf(n++i);
  116. if(f1!=f2)
  117. fa[f1]=f2;
  118. }
  119. }
  120. if(finf(n+)!=finf(n+))
  121. {
  122. printf("%d\n",);
  123. return ;
  124. }
  125. s=n+;
  126. int N;
  127. int popu=;
  128. for(N=;;N++)
  129. {
  130. if(N)
  131. {
  132. for(int i=;i<=n+m+;i++)
  133. {
  134. ade((N-)*(n+m+)+i,N*(n+m+)+i,oo);
  135. ade(N*(n+m+)+i,(N-)*(n+m+)+i,);
  136. }
  137. }
  138. size=(N+)*(n+m+);
  139. t=N*(n+m+)+n+;
  140. for(int i=;i<=m;i++)
  141. {
  142. int tp=st[i][N%st[i].size()];
  143. if(tp!=n+)
  144. {
  145. ade(N*(n+m+)+n++i,N*(n+m+)+tp,H[i]);
  146. ade(N*(n+m+)+tp,N*(n+m+)+n++i,);
  147. }
  148. if(tp!=n+)
  149. {
  150. ade(N*(n+m+)+tp,N*(n+m+)+n++i,H[i]);
  151. ade(N*(n+m+)+n++i,N*(n+m+)+tp,);
  152. }
  153. }
  154. popu+=Dinic();
  155. if(popu<k);else break;
  156. }
  157. printf("%d\n",N);
  158. return ;
  159. }

LuoguP2754 [CTSC1999]家园(分层图,最大流)的更多相关文章

  1. [CTSC1999]家园 分层图网络流_并查集

    Code: #include<cstdio> #include<vector> #include<algorithm> #include<queue> ...

  2. ZOJ-2364 Data Transmission 分层图阻塞流 Dinic+贪心预流

    题意:给定一个分层图,即只能够在相邻层次之间流动,给定了各个顶点的层次.要求输出一个阻塞流. 分析:该题直接Dinic求最大流TLE了,网上说采用Isap也TLE,而最大流中的最高标号预流推进(HLP ...

  3. 洛谷4400 BlueMary的旅行(分层图+最大流)

    qwq 首先,我们观察到题目中提到的每天只能乘坐一次航班的限制,很容易想到建分层图,也就是通过枚举天数,然后每天加入一层新的点. (然而我一开始想的却是erf) 考虑从小到大枚举天数,然后每次新建一层 ...

  4. bzoj 1189: [HNOI2007]紧急疏散evacuate 分层图最大流_拆点_二分

    Description 发生了火警,所有人员需要紧急疏散!假设每个房间是一个N M的矩形区域.每个格子如果是'.',那么表示这是一 块空地:如果是'X',那么表示这是一面墙,如果是'D',那么表示这是 ...

  5. YbtOJ-大收藏家【分层图,最大流】

    正题 题目链接:https://www.ybtoj.com.cn/contest/117/problem/2 题目大意 \(n\)个人,每人有\(a_i\)个属于自己的物品.\(m\)次交换依次进行, ...

  6. 【洛谷 P2754】 [CTSC1999]家园(最大流)

    题目链接 突然发现Dinic很好写诶.. 第一次数组开小了,玄学\(WA\),what?数据范围描述有误? 分层图,每天为一层. 把上一天的每个空间站向这一天连一条流量为inf的边,表示可以原地不动. ...

  7. 洛谷2754 [CTSC1999]家园

    题目链接:[CTSC1999]家园 这个题目我们不是很好在做网络流的时候判断是否有解,因此我们考虑分开来做 对于是否有解的判断,我们唯一需要解决的是飞船的周期停泊问题,对于这个问题,我们可以用并查集解 ...

  8. ACdream 1017 [分层图][网络流]

    /* 大连热身C题 不要低头,不要放弃,不要气馁,不要慌张 题意: 给一个城市路线图,给定起点给定终点.有n个货物从起点运送到终点.城市的边是无向边. 每个货物每天如果通过某条路,那么这天这条路只能运 ...

  9. [网络流24题][CTSC1999] 家园

    题目链接:戳我 对于这种一个点(表面意义上的一个点,比如说一个位置)对应多种情况的(比如说随着时间的推移有着不同的状态,而且这种状态>2),我们考虑在类似于分层图上面跑网络流. 比如说这道题,周 ...

随机推荐

  1. 添加本地 yum源

    添加本地 yum源 yum-updatesd.conf yum的主配置文件   [root@zhou ~]# cd /etc/yum.repos.d/ [root@zhou yum.repos.d]# ...

  2. Mysql 主从主主复制总结(详细)

    环境:Centos 6.9,Mysql 8.0 配置准备:1.为Centos配置好网络,使用远程工具连接. 2.安装mysql,途径不限.mysql8.0和5.7区别不大,8.0在配置主从的时候默认开 ...

  3. 前端之HTTP协议

    HTTP协议简介 作为学习前端开发的开始,我们必须搞明白以下几件事 1.什么是互联网      互联网=物理连接介质+互联网协议     2.互联网建立的目的? 数据传输打破地域限制,否则的话,我想获 ...

  4. Android SDK Manager代理设置

    1.SDK Manager中打开 Tools—>Manage Add-on Sites…—>User Defined Sites 2.New …输入: http://android-mir ...

  5. 自己定义View之Chart图标系列(1)——点阵图

    近期要做一些图表类的需求,一開始就去github上看了看,发现开源的图表框架还是蛮多的.可是非常少有全然符合我的需求的.另外就是使用起来比較麻烦.所以就决定自己来造轮子了~~~ 今天要介绍的就是And ...

  6. Android资源之图像资源(状态图像资源)

    在上一篇博文中.我主要解说了XML图像资源中的图层资源,在此图像资源博文中我会给大家陆续解说XMl图像资源的图像状态资源.图像级别资源.淡入淡出资源.嵌入图像资源.剪切图像资源和外形资源. 1.图像状 ...

  7. UltraEdit Companion Utility

    UltraEdit Companion Utility 配色组件 http://www.danielwmoore.com/extras/index.php?action=downloads;sa=vi ...

  8. POJ Euro Efficiency 1252

    Euro Efficiency Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 4109   Accepted: 1754 D ...

  9. 微信小程序官方文档中的加密算法

    用Nodejs来算一下:

  10. element-ui表格控件前端分页方法

    <div id="app"> <el-table :data="tableData.slice((currentPage-1)*pageSize,cur ...