【算法】网络流-最大流(dinic)

【题解】

飞船有可承载人数限制,地球为源点,月球为汇点,人像水流一样从以飞船上限为容量的边流向汇点。

人在各站点都面临着上船与否的选择,难以用DP解决最优策略,于是这样的取舍问题可以使用网络流。

其实主要是看数据范围。

构图思路:

由于我们要计算时间,所以使变量T从1开始循环直到运送完毕。

对于每个时间相应加边,从而可以不用在意周期问题。

时间T,对于每个点增加一个T*22+i的分点,并从(T-1)分点向T分点连一条容量为inf的边。

对于飞行路径从(T-1)*22+u向T*22+v连一条容量为p[i]的边。

构图完毕。

最后推一下极限情况下最长的时间,超过了输出0即可。

tot=1,不是0,不是2!

要加当前弧优化,速度会快很多(101ms→2ms)!

  1. #include<cstdio>
  2. #include<algorithm>
  3. #include<cstring>
  4. using namespace std;
  5. const int inf=0x3f3f3f3f;
  6. struct edge{int from,v,flow;}e[];
  7. int S=,T,tot=,first[],q[],a[][],cur[],d[],p[],n,m,k;
  8. void insert(int u,int v,int w)
  9. {
  10. tot++;e[tot].v=v;e[tot].flow=w;e[tot].from=first[u];first[u]=tot;
  11. tot++;e[tot].v=u;e[tot].flow=;e[tot].from=first[v];first[v]=tot;
  12. }
  13. bool bfs()
  14. {
  15. memset(d,-,sizeof(d));
  16. int head=,tail=;q[]=;d[]=;
  17. while(head!=tail)
  18. {
  19. int x=q[head++];if(head>=)head=;
  20. for(int i=first[x];i;i=e[i].from)
  21. if(d[e[i].v]==-&&e[i].flow>)
  22. {
  23. q[tail++]=e[i].v;if(tail>=)tail=;
  24. d[e[i].v]=d[x]+;
  25. }
  26. }
  27. if(d[T*+n+]==-)return ;
  28. return ;
  29. }
  30. int dfs(int x,int a)
  31. {
  32. if(x==T*+n+||a==)return a;
  33. int flow=,f;
  34. for(int& i=cur[x];i;i=e[i].from)
  35. if(d[e[i].v]==d[x]+&&(f=dfs(e[i].v,min(a,e[i].flow)))>)
  36. {
  37. e[i].flow-=f;
  38. e[i^].flow+=f;
  39. flow+=f;
  40. a-=f;
  41. if(a==)break;
  42. }
  43. return flow;
  44. }
  45. int main()
  46. {
  47. scanf("%d%d%d",&n,&m,&k);
  48. for(int i=;i<=m;i++)
  49. {
  50. scanf("%d%d",&p[i],&a[i][]);
  51. for(int j=;j<=a[i][];j++)
  52. {
  53. scanf("%d",&a[i][j]);
  54. if(a[i][j]==-)a[i][j]=n+;
  55. }
  56. }
  57. for(T=;T<=;T++)
  58. {
  59. for(int i=;i<=n+;i++)
  60. {
  61. insert((T-)*+i,T*+i,inf);
  62. }
  63. for(int i=;i<=m;i++)
  64. {
  65. int u=(T-)*+a[i][(T-)%a[i][]+];
  66. int v=T*+a[i][T%a[i][]+];
  67. insert(u,v,p[i]);
  68. }
  69. while(bfs())
  70. {
  71. for(int i=;i<=T*+n+;i++)cur[i]=first[i];
  72. k-=dfs(,inf);
  73. }
  74. if(k<=){printf("%d",T);return ;}
  75. }
  76. printf("");
  77. return ;
  78. }

【CODEVS】1034 家园的更多相关文章

  1. 【wikioi】1034 家园(最大流+特殊的技巧)

    http://wikioi.com/problem/1034/ 太神了这题. 其实一开始我以为是费用流,但是总感觉不对. 原因是我没看到一句话,特定的时刻到达特定的点!! 也就是说,并不是每艘船每次都 ...

  2. [wikioi 1034][CTSC 1999]家园(网络流)

    由于人类对自然的疯狂破坏,人们意识到在大约2300年之后,地球不能再居住了,于是在月球上建立了新的绿地,以便在需要时移民.令人意想不到的是,2177年冬由于未知的原因,地球环境发生了连锁崩溃,人类必须 ...

  3. 【codevs1034】 家园

    http://codevs.cn/problem/1034/ (题目链接) 题意 给出一张n个点的图,有m架飞船按照固定的航班运行,没单位时间移动一次,并且没收航班都有自己的容纳量.问从0号点将K个人 ...

  4. CODEVS_1034 家园 网络流 最大流

    原题链接:http://codevs.cn/problem/1034/ 题目描述 Description 由于人类对自然的疯狂破坏,人们意识到在大约2300年之后,地球不能再居住了,于是在月球上建立了 ...

  5. codevs 3289 花匠

    题目:codevs 3289 花匠 链接:http://codevs.cn/problem/3289/ 这道题有点像最长上升序列,但这里不是上升,是最长"波浪"子序列.用动态规划可 ...

  6. codevs 1082 线段树练习 3(区间维护)

    codevs 1082 线段树练习 3  时间限制: 3 s  空间限制: 128000 KB  题目等级 : 大师 Master 题目描述 Description 给你N个数,有两种操作: 1:给区 ...

  7. codevs 1285 二叉查找树STL基本用法

    C++STL库的set就是一个二叉查找树,并且支持结构体. 在写结构体式的二叉查找树时,需要在结构体里面定义操作符 < ,因为需要比较. set经常会用到迭代器,这里说明一下迭代器:可以类似的把 ...

  8. codevs 1576 最长上升子序列的线段树优化

    题目:codevs 1576 最长严格上升子序列 链接:http://codevs.cn/problem/1576/ 优化的地方是 1到i-1 中最大的 f[j]值,并且A[j]<A[i] .根 ...

  9. codevs 1080 线段树点修改

    先来介绍一下线段树. 线段树是一个把线段,或者说一个区间储存在二叉树中.如图所示的就是一棵线段树,它维护一个区间的和. 蓝色数字的是线段树的节点在数组中的位置,它表示的区间已经在图上标出,它的值就是这 ...

随机推荐

  1. java锁有哪些类(转)

    转载来源:http://www.cnblogs.com/lxmyhappy/p/7380073.html 1.Java都有哪些锁? 公平锁/非公平锁 可重入锁 独享锁/共享锁 互斥锁/读写锁 乐观锁/ ...

  2. 用C++实现简单随机二元四则运算

    让我们想看看二元四则运算都需要实现什么: (1) 定制题目数量 (2) 是否有乘除法 (3) 题目数值范围 (4) 加减有无负数 (5) 除法有无余数 (6) 是否支持分数(真分数.假分数…) (7) ...

  3. 解决Ubuntu(Linux)平台下Sublime Text 3 安装中文输入支持库后 开启gnome-terminal报错的问题

    在Ubuntu下安装Sublim Text3后发现无法输入中文,按照此链接的方法解决后.然后用下列代码配置C++的编译系统: { "cmd":["g++",&q ...

  4. week1词频统计

    使用java完成对txt格式的英文短片进行字符提取及统计. package nenu.softWareProject; import java.io.*;import java.util.*; pub ...

  5. ThinkPHP的调用css,js和图片的路径

    按网上的说法,在根目录下建了一个Public目录,把css,js和图片放到Public目录下,然后用__PUBLIC__/...或__ROOT__/Public/...调用.但是发现无论如何改路径都无 ...

  6. JSON字符串转换成对象时候 需要有默认构造器 因为这是通过反射创建的 反射是先通过默认构造器创建对象的

    JSON字符串转换成对象时候 需要有默认构造器 因为这是通过反射创建的 反射是先通过默认构造器创建对象的

  7. java执行cmd命令并获取输出结果

    1.java执行cmd命令并获取输出结果 import java.io.BufferedReader; import java.io.InputStreamReader; import org.apa ...

  8. 【刷题】LOJ 6038 「雅礼集训 2017 Day5」远行

    题目描述 Miranda 生活的城市有 \(N\) 个小镇,一开始小镇间没有任何道路连接.随着经济发现,小镇之间陆续建起了一些双向的道路但是由于经济不太发达,在建设过程中,会保证对于任意两个小镇,最多 ...

  9. [AT2369] [agc013_c] Ants on a Circle

    题目链接 AtCoder:https://agc013.contest.atcoder.jp/tasks/agc013_c 洛谷:https://www.luogu.org/problemnew/sh ...

  10. 解决:warning LNK4098: 默认库“MSVCRT”与其他库的使用冲突;找到 MSIL .netmodule 或使用 /GL 编译的模块;正在。。;LINK : warning LNK4075: 忽略“/INCREMENTAL”(由于“/LTCG”规范)

    原文链接地址:https://www.cnblogs.com/qrlozte/p/4844411.html 参考资料: http://blog.csdn.net/laogaoav/article/de ...