P2762 太空飞行计划问题

题目背景

题目描述

W 教授正在为国家航天中心计划一系列的太空飞行。每次太空飞行可进行一系列商业性实验而获取利润。现已确定了一个可供选择的实验集合E={E1,E2,…,Em},和进行这些实验需要使用的全部仪器的集合I={I1,I2,…In}。实验Ej需要用到的仪器是I的子集RjÍI。配置仪器Ik的费用为ck美元。实验Ej的赞助商已同意为该实验结果支付pj美元。W教授的任务是找出一个有效算法,确定在一次太空飞行中要进行哪些实验并因此而配置哪些仪器才能使太空飞行的净收益最大。这里净收益是指进行实验所获得的全部收入与配置仪器的全部费用的差额。

对于给定的实验和仪器配置情况,编程找出净收益最大的试验计划。

输入输出格式

输入格式:

第1行有2 个正整数m和n。m是实验数,n是仪器数。接下来的m 行,每行是一个实验的有关数据。第一个数赞助商同意支付该实验的费用;接着是该实验需要用到的若干仪器的编号。最后一行的n个数是配置每个仪器的费用。

输出格式:

第1 行是实验编号;第2行是仪器编号;最后一行是净收益。

输入输出样例

输入样例#1:

  1. 2 3
  2. 10 1 2
  3. 25 2 3
  4. 5 6 7
输出样例#1:

  1. 1 2
  2. 1 2 3
  3. 17

说明

感谢@zhouyonglong 提供spj

分析

网络流经典建模题,最大权闭合子图,注意建图,

建立源点S,汇点T,S向每个实验连边容量为获益,每个器材向T连边容量为费用,其他的边容量为正无穷,求最小割(=最大流);

最大权闭合图问题

code

  1. #include<cstdio>
  2. #include<algorithm>
  3. #include<queue>
  4. #include<cstring>
  5.  
  6. using namespace std;
  7.  
  8. const int INF = 0x7fffffff;
  9. const int MAXN = ;
  10. struct Edge{
  11. int to,c,nxt;
  12. }e[];
  13.  
  14. int head[MAXN],dis[MAXN];
  15. int s,t,tot=;
  16. queue<int>q;
  17.  
  18. int read(int &x)
  19. {
  20. x = ;char ch = getchar();
  21. for (; ch<''||ch>''; ch = getchar());
  22. for (; ch>=''&&ch<=''; ch = getchar())
  23. x = x*+ch-'';
  24. if (ch==||ch==) return ;
  25. return ;
  26. }
  27. void add_edge(int u,int v,int w)
  28. {
  29. e[++tot].c = w,e[tot].to = v,e[tot].nxt = head[u];
  30. head[u] = tot;
  31. e[++tot].c = ,e[tot].to = u,e[tot].nxt = head[v];
  32. head[v] = tot;
  33. }
  34. bool bfs()
  35. {
  36. memset(dis,-,sizeof(dis));
  37. dis[s] = ;
  38. q.push(s);
  39. while (!q.empty())
  40. {
  41. int u = q.front();
  42. q.pop();
  43. for (int i=head[u]; i; i=e[i].nxt)
  44. {
  45. int v = e[i].to;
  46. if (dis[v]==-&&e[i].c>)
  47. {
  48. dis[v] = dis[u]+;
  49. q.push(v);
  50. }
  51. }
  52. }
  53. return dis[t]!=-;
  54. }
  55. int dfs(int u,int low)
  56. {
  57. if (u==t) return low;
  58. int w,tmp = low;
  59. for (int i=head[u]; i; i=e[i].nxt)
  60. {
  61. int v = e[i].to;
  62. if (dis[v]==dis[u]+&&e[i].c>)
  63. {
  64. w = dfs(v,min(e[i].c,low));
  65. e[i].c -= w;
  66. e[i^].c += w;
  67. low -= w;
  68. }
  69. }
  70. return tmp - low;
  71. }
  72. int main()
  73. {
  74. int ans = ,sum = ,m,n,flag;
  75. read(m),read(n);
  76. s = ,t = n+m+;
  77. for (int x,i=; i<=m; ++i)
  78. {
  79. flag = ;
  80. read(x);
  81. sum += x;
  82. add_edge(s,i,x);
  83. while (flag)
  84. {
  85. flag = read(x);
  86. add_edge(i,x+m,INF);
  87. }
  88. }
  89. for (int x,i=; i<=n; ++i)
  90. {
  91. read(x);
  92. add_edge(i+m,t,x);
  93. }
  94. while (bfs())
  95. ans += dfs(s,INF);
  96. for (int i=; i<=m; ++i)
  97. if (dis[i]!=-) printf("%d ",i);
  98. printf("\n");
  99. for (int i=m+; i<=t; ++i)
  100. if (dis[i]!=-) printf("%d ",i-m);
  101. printf("\n%d\n",sum-ans);
  102. return ;
  103. }

网络流24题:P2762 太空飞行计划问题的更多相关文章

  1. LOJ6001 - 「网络流 24 题」太空飞行计划

    原题链接 Description 有个实验和个仪器,做实验有报酬买仪器有花费.每个实验都需要一些仪器,求最大净收益(实验报酬仪器花费),并输出一组方案. Solution 实验向所需仪器连边,实验的点 ...

  2. LibreOJ #6001. 「网络流 24 题」太空飞行计划 最大权闭合图

    #6001. 「网络流 24 题」太空飞行计划 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:Special Judge 上传者: 匿名 提交提交记录统计讨论测 ...

  3. Luogu 2762 太空飞行计划 / Libre 6001 「网络流 24 题」太空飞行计划 (网络流,最大流)

    Luogu 2762 太空飞行计划 / Libre 6001 「网络流 24 题」太空飞行计划 (网络流,最大流) Description W 教授正在为国家航天中心计划一系列的太空飞行.每次太空飞行 ...

  4. 题解:线性规划与网络流24题 T2 太空飞行计划问题

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

  5. 【刷题】LOJ 6001 「网络流 24 题」太空飞行计划

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

  6. LibreOJ #6001. 「网络流 24 题」太空飞行计划

    \(\quad\) 与网络流有关的最值有三个:最大流,最小费用,最小割.这道题是最小割.想了好久,终于想明白最小割应该怎么用. \(\quad\) 先找出矛盾的事物.在这道题中,两件事是矛盾的:做实验 ...

  7. [Cogs727] [网络流24题#2] 太空飞行计划 [网络流,最小割]

    建图:源点—(w[i])—>实验—(∞)—>仪器—(cost[i])—>汇点, 如果该实验造成收益,则仪器到汇点的边在最小割中, 如果该实验造成损失,则源点到实验的边在最小割中, 故 ...

  8. 【PowerOJ1737&网络流24题】太空飞行计划问题(最小割)

    题意: 思路: #include<bits/stdc++.h> using namespace std; typedef long long ll; typedef unsigned in ...

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

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

随机推荐

  1. vue-cli之脚手架

    一.创建VUE项目 npm install vue-cli -g vue init webpack myprject cd myproject npm run dev 补充: 组件:它是可扩展的htm ...

  2. logback的configuration

    logback的<configuration>只有三个属性: 1.scan[boolean]:当scan被设置为true时,当配置文件发生改变,将会被重新加载.默认值为true. 2.sc ...

  3. mail客户端POP和IMAP协议

    POP-邮局协议 mail客户端如果使用POP协议,那么线上服务器的邮件将会自动下载到客户端. IMAP-因特网消息访问协议 mail客户端如果使用IMAP协议,邮件服务器上的邮件将不会自动下载到客户 ...

  4. COGS 11. 运输问题1

    ★★☆   输入文件:maxflowa.in   输出文件:maxflowa.out   简单对比时间限制:1 s   内存限制:128 MB [问题描述]     一个工厂每天生产若干商品,需运输到 ...

  5. leetcode--5 Longest Palindromic Substring

    1. 题目: Given a string S, find the longest palindromic substring in S. You may assume that the maximu ...

  6. noip模拟赛#23

    T1:n个元素的集合.要求取出k个子集,使得k个子集交集为空集.问有多少中取法. =>推了很久...想的是从k等于2的情况推到k等于3的情况....然后k=2推出来了k=3也推出来了...推了挺 ...

  7. 2018.5.30 Oracle数据库PLSQL编程---游标的使用

    显示游标的步骤 /* 显示游标处理步骤 1.声明游标 语法结构:cursor 游标名称 is SQL 语句; 2.打开游标 语法结构:open游标名称; 3.提取数据 语法结构:fetch 4.关闭游 ...

  8. java程序换图标

    ImageIcon img = new ImageIcon("D:\\mahou-in-action\\ShiJuanFenXi\\src\\zoom-in.png"); inst ...

  9. Bootstrap 警告框(Alert)插件

    警告消息大多来是用来向终端用户提示警告或确认的消息,使用警告框插件,您可以向所有的警告框消息添加取消功能. 用法 您有以下两种方式启用警告框的可取消功能. 1.通过data属性:通过数据添加可取消功能 ...

  10. 初尝微信小程序1-特点

    微信小程序特点:1.不需要下载安装即可使用 2.用户用完即走,不用关心是否安装太多应用 3.应用将无处不在,随时可用 适合开发的小程序类型:1.简单的用完即走的应用 2.低频的应用 3.性能要求不高的 ...