这题套路好深......没想渠。

题意:给你若干个设备,若干个任务。

每个任务需要若干设备,设备可重复利用。

完成任务有钱,买设备要钱。

问最大总收益(可以什么任务都不做)。

解:最大权闭合子图。

对于一个有向图,如果选择了一个点,那么就要选择它的所有后继节点。求最大权值和。

建立s,t,记所有正权值和为sum。

s向所有权值为正的点连边,流量为权值。

所有权值为负的点向t连边,流量为权值的绝对值。

对于所有边,建立流量INF的边。

答案即为sum - 最小割。

证明:

你割的边显然只能与s或t相连。

如果割了s -> a,表示不选a。

如果割了b -> t,表示选b。

那么如果你选了一个点c,那么就没割,那么c的所有后继节点肯定都割了。

大概就是这样...意会一下吧。

  1. #include <cstdio>
  2. #include <queue>
  3. #include <algorithm>
  4. #include <cstring>
  5. #include <iostream>
  6. #include <string>
  7.  
  8. const int N = , M = , INF = 0x3f3f3f3f;
  9.  
  10. struct Edge {
  11. int nex, v, c;
  12. }edge[M << ]; int top = ;
  13.  
  14. int e[N], d[N], use[N];
  15. std::queue<int> Q;
  16. std::string str;
  17.  
  18. inline void add(int x, int y, int z) {
  19. top++;
  20. edge[top].v = y;
  21. edge[top].c = z;
  22. edge[top].nex = e[x];
  23. e[x] = top;
  24.  
  25. top++;
  26. edge[top].v = x;
  27. edge[top].c = ;
  28. edge[top].nex = e[y];
  29. e[y] = top;
  30. return;
  31. }
  32.  
  33. inline bool BFS(int s, int t) {
  34. memset(d, , sizeof(d));
  35. d[s] = ;
  36. Q.push(s);
  37. while(!Q.empty()) {
  38. int x = Q.front();
  39. Q.pop();
  40. for(int i = e[x]; i; i = edge[i].nex) {
  41. int y = edge[i].v;
  42. if(!edge[i].c || d[y]) {
  43. continue;
  44. }
  45. d[y] = d[x] + ;
  46. Q.push(y);
  47. }
  48. }
  49. return d[t];
  50. }
  51.  
  52. int DFS(int x, int t, int maxF) {
  53. if(x == t) {
  54. return maxF;
  55. }
  56. int ans = ;
  57. for(int i = e[x]; i; i = edge[i].nex) {
  58. int y = edge[i].v;
  59. if(!edge[i].c || d[x] + != d[y]) {
  60. continue;
  61. }
  62. int temp = DFS(y, t, std::min(edge[i].c, maxF - ans));
  63. if(!temp) {
  64. d[y] = INF;
  65. }
  66. ans += temp;
  67. edge[i].c -= temp;
  68. edge[i ^ ].c += temp;
  69. if(ans == maxF) {
  70. break;
  71. }
  72. }
  73. return ans;
  74. }
  75.  
  76. inline int solve(int s, int t) {
  77. int ans = ;
  78. while(BFS(s, t)) {
  79. ans += DFS(s, t, INF);
  80. }
  81. return ans;
  82. }
  83.  
  84. inline void read(int *a) {
  85. getline(std::cin, str);
  86. a[] = ;
  87. int len = str.size();
  88. int f = ;
  89. for(int i = ; i < len; i++) {
  90. if(str[i] < '' || str[i] > '') {
  91. f = ;
  92. }
  93. else {
  94. if(!f) {
  95. f = ;
  96. a[++a[]] = str[i] - '';
  97. }
  98. else {
  99. (a[a[]] *= ) += str[i] - '';
  100. }
  101. }
  102. }
  103. return;
  104. }
  105.  
  106. int main() {
  107. int m, n, sum = ;
  108. scanf("%d%d", &m, &n);
  109. int s = m + n + , t = n + m + ;
  110. for(int i = , x; i <= m; i++) {
  111. scanf("%d", &x);
  112. add(s, i, x);
  113. read(use);
  114. for(int j = ; j <= use[]; j++) {
  115. add(i, m + use[j], INF);
  116. }
  117. sum += x;
  118. }
  119. for(int i = , x; i <= n; i++) {
  120. scanf("%d", &x);
  121. add(m + i, t, x);
  122. }
  123.  
  124. int ans = solve(s, t);
  125. for(int i = ; i <= m; i++) {
  126. if(d[i]) {
  127. printf("%d ", i);
  128. }
  129. }
  130. puts("");
  131. for(int i = ; i <= n; i++) {
  132. if(d[i + m]) {
  133. printf("%d ", i);
  134. }
  135. }
  136. printf("\n%d", sum - ans);
  137. return ;
  138. }

AC代码

洛谷P2762 太空飞行计划问题的更多相关文章

  1. 洛谷 P2762 太空飞行计划问题 P3410 拍照【最大权闭合子图】题解+代码

    洛谷 P2762 太空飞行计划问题 P3410 拍照[最大权闭合子图]题解+代码 最大权闭合子图 定义: 如果对于一个点集合,其中任何一个点都不能到达此集合以外的点,这就叫做闭合子图.每个点都有一个权 ...

  2. 洛谷 P4174 [NOI2006]最大获利 && 洛谷 P2762 太空飞行计划问题 (最大权闭合子图 && 最小割输出任意一组方案)

    https://www.luogu.org/problemnew/show/P4174 最大权闭合子图的模板 每个通讯站建一个点,点权为-Pi:每个用户建一个点,点权为Ci,分别向Ai和Bi对应的点连 ...

  3. 洛谷 - P2762 - 太空飞行计划问题 - 最小割

    https://www.luogu.org/problemnew/solution/P2762 最小割对应的点,在最后一次更新中dinic的bfs会把他的dep重置掉.所以可以根据这个性质复原最小割. ...

  4. 洛谷 [P2762] 太空飞行计划问题

    最大权闭合子图 胡伯涛论文真是个好东西.jpg 求一个有向图的最大权闭合子图,常应用于有先决条件的最优化问题中 将所有正权点与源点相连,容量为点权; 将所有负权点与汇点相连,容量为点权的相反数; 将原 ...

  5. 洛谷P2762 太空飞行计划问题(最小割)

    传送门 我们可以把实验放在左边,仪器放在右边,点有点权,然后连对应的有向边,就是求一个最大权闭合图,可以转化为最小割来做(关于这具体是个啥……可以百度胡伯涛<最小割模型在信息学竞赛中的应用> ...

  6. 洛谷P2762 太空飞行计划问题(最大权闭合图)

    题意 有$m$个实验,$n$中器材,每个实验需要使用一些器材 每个实验有收入,每个器材有花费 最大化收入 - 花费 Sol 最大权闭合图的经典应用 从$S$向每个实验连流量为该实验收入的边 从每个器材 ...

  7. 洛谷 P2762 太空飞行计划问题 【最大权闭合子图+最小割】

    --一道难在读入的题. 最后解决方案直接getline一行然后是把读优拆掉放进函数,虽然很丑但是过了. 然后就是裸的最大权闭合子图了,把仪器当成负权点向t连流量为其价格的边,s向实验连流量为实验报酬的 ...

  8. 网络流24题:P2762 太空飞行计划问题

    P2762 太空飞行计划问题 题目背景 题目描述 W 教授正在为国家航天中心计划一系列的太空飞行.每次太空飞行可进行一系列商业性实验而获取利润.现已确定了一个可供选择的实验集合E={E1,E2,…,E ...

  9. P2762 太空飞行计划问题(网络流24题之一)

    题目描述 W 教授正在为国家航天中心计划一系列的太空飞行.每次太空飞行可进行一系列商业性实验而获取利润.现已确定了一个可供选择的实验集合E={E1,E2,…,Em},和进行这些实验需要使用的全部仪器的 ...

随机推荐

  1. laravel中如何在模型中自关联?

    https://segmentfault.com/q/1010000007926567 在模型中声明一对多的关系,关联表本身.parent_id对应父记录的id.我在sof中查阅到很多这样的写法: p ...

  2. js尾递归函数

    普通递归: function fac(n) { if (n === 1) return 1; return n * fac(n - 1); } fac(5) // 120 这是个阶乘.但是占用内存,因 ...

  3. j收集ava面试题

    史上最全Java面试题(带全部答案) https://blog.csdn.net/linzhiqiang0316/article/details/80473906

  4. Python:matplotlib绘制线条图

    线型图是学习matplotlib绘图的最基础案例.我们来看看具体过程:  下面我们将两条曲线绘制到一个图形里:   可以看到这种方式下,两个线条共用一个坐标轴,并且自动区分颜色. plot方法的核心是 ...

  5. 莫烦theano学习自修第八天【分类问题】

    1. 代码实现 from __future__ import print_function import numpy as np import theano import theano.tensor ...

  6. linux 挂载windows下目录,其它linux机器nfs的目录,自己dd的文件

    如有转载,不胜荣幸.http://www.cnblogs.com/aaron-agu/ 挂载window下共享的目录 //192.168.0.11/share /mnt 挂载其它linux机器下目录 ...

  7. Spring 使用介绍(十二)—— Spring Task

    一.概述 1.jdk的线程池和任务调用器分别由ExecutorService.ScheduledExecutorService定义,继承关系如下: ThreadPoolExecutor:Executo ...

  8. 【XSY2535】整数 NTT

    题目描述 问有多少个满足以下要求的\(k\)进制数: 1.每个数字出现的次数不超过\(n\) 2.\(0\)没有出现过 3.若\(g_{i,j}=0\),则\(i\)不能出现恰好\(j\)次. 两次询 ...

  9. Xadmin 组件基础使用以及全局配置

    xadmin 的安装 方式一 pip 安装 会因为编码问题导致报错 因此需要下载 更改 README.rst 后本地安装 详情点击这里 方式二 源码方式安装 在 github 上下载源码后 将 xad ...

  10. qml(Qt Quick)做界面

    qml(Qt Quick)做界面 来源  https://www.zhihu.com/question/24880681/answer/29324824 本人是Qt初学者,正在写一个会计小软件(Lin ...