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. springboot 学习笔记(九)

    springboot整合activemq,实现broker集群部署(cluster) 1.为实现jms高并发操作,需要对activemq进行集群部署,broker cluster就是activemq自 ...

  2. Second Highest Salary

    Write a SQL query to get the second highest salary from the Employee table. +----+--------+ | Id | S ...

  3. Customers Who Never Order

    Suppose that a website contains two tables, the Customers table and the Orders table. Write a SQL qu ...

  4. 一张图掌握移动Web前端所有技术(大前端、工程化、预编译、自动化)

    你要的移动web前端都在这里! 大前端方向:移动Web前端.Native客户端.Node.js. 大前端框架:React.Vue.js.Koa  跨终端技术:HTML 5.CSS 3.JavaScri ...

  5. /usr/local/sbin/arpspoof

    /usr/local/sbin/arpspoof arpspoof -t 攻击者ip地址 网关ip地址 稍等系,被攻击者机器的arp的缓存就已经变了.

  6. python 实例方法,类方法,静态方法

    实例方法 class Human(object): def __init__(self, weight): self.weight = weight def get_weight(self): ret ...

  7. Echarts图表学习

    最近项目已经运行的比较稳定了,正巧看到ECcharts的图标很炫,遂做一个玩玩,以备后面做数据分析使用. 官网地址:http://echarts.baidu.com/index.html 大致了解了下 ...

  8. HDU5124 lines

    离散化 + 树状数组. 这些东西自己都是刚接触不久的,所以需要多写点题练练手. 题目描述: 一维坐标中有N条线段,其中有一个点上面覆盖的线段数是最多的,求该点上面的线段数目. 这道题和HDU1556特 ...

  9. 【Orange Pi Lite2】 ——2《在使用之前的配置》(未完)

    [Orange Pi Lite2] --2<在使用之前的配置> 本文只在博客园发布 在开始前你需要准备的材料与软件 filezilla/或者不 声明 : 本教程适合0基础新手,本章将会介绍 ...

  10. 一些好的IOS blog 不断增加中。。。。

    http://www.swiftkiller.com/?p=371 http://blog.csdn.net/javayujiafeng/article/details/14163319 http:/ ...