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行是仪器编号;最后一行是净收益。


最大权闭合子图:源点连正点权(即实验收益),容量为正;负点权(器材花费)连汇点,容量为负的负(花费较总收益来说原本就是负的,连得时候连正的就行),有关系的实验和器材之间连边容量为正无穷,答案为全部实验收益 - 上面图跑出来的最小割

解释:正点之间与负点连边为INF最小割跑出来,要么割正边,意义就是舍弃这个实验,要么割负的负边,意义为买器材花钱,无论怎样,要是使得放弃实验钱与花的器材钱最少(也就是最小割),答案即为最优

Code

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<queue>
  4. #include<cstring>
  5. #include<algorithm>
  6. #define ll long long
  7. using namespace std;
  8. int RD(){
  9. int out = 0,flag = 1;char c = getchar();
  10. while(c < '0' || c >'9'){if(c == '-')flag = -1;c = getchar();}
  11. while(c >= '0' && c <= '9'){out = out * 10 + c - '0';c = getchar();}
  12. return flag * out;
  13. }
  14. const int maxn = 10019,INF = 1e9;;
  15. int nl,nr,nume = 1;
  16. int s,t,maxflow;
  17. int head[maxn],cur[maxn];
  18. struct Node{
  19. int v,dis,nxt;
  20. }E[maxn << 2];
  21. void add(int u,int v,int dis){
  22. E[++nume].nxt = head[u];
  23. E[nume].v = v;
  24. E[nume].dis = dis;
  25. head[u] = nume;
  26. }
  27. int d[maxn];
  28. bool bfs(){
  29. queue<int>Q;
  30. memset(d,0,sizeof(d));
  31. for(int i = 1;i <= t;i++)cur[i] = head[i];
  32. Q.push(s);
  33. d[s] = 1;
  34. while(!Q.empty()){
  35. int u = Q.front();
  36. Q.pop();
  37. for(int i = head[u];i;i = E[i].nxt){
  38. int v = E[i].v;
  39. if(E[i].dis && !d[v]){
  40. d[v] = d[u] + 1;
  41. Q.push(v);
  42. if(v == t)return 1;
  43. }
  44. }
  45. }
  46. return 0;
  47. }
  48. int Dinic(int u,int flow){
  49. if(u == t)return flow;
  50. int rest = flow,k;
  51. for(int i = cur[u];i != -1;i = E[i].nxt){
  52. cur[u] = i;
  53. int v = E[i].v;
  54. if(E[i].dis && d[v] == d[u] + 1){
  55. k = Dinic(v,min(rest,E[i].dis));
  56. if(!k)d[v] = 0;
  57. E[i].dis -= k;
  58. E[i ^ 1].dis += k;
  59. rest -= k;
  60. }
  61. if(rest == 0)break;
  62. }
  63. return flow - rest;
  64. }
  65. int tot,ans;
  66. int main(){
  67. memset(head,-1,sizeof(head));
  68. nl = RD();nr = RD();
  69. s = nl + nr + 1,t = s + 1;
  70. int temp;
  71. for(int i = 1;i <= nl;i++){
  72. temp = RD();
  73. tot += temp;
  74. add(s,i,temp);
  75. add(i,s,0);
  76. char tools[10000];
  77. memset(tools,0,sizeof tools);
  78. cin.getline(tools,10000);
  79. int ulen=0,tool;
  80. while (sscanf(tools+ulen,"%d",&tool)==1)//之前已经用scanf读完了赞助商同意支付该实验的费用
  81. {//tool是该实验所需仪器的其中一个
  82. //这一行,你可以将读进来的编号进行储存、处理,如连边。
  83. add(i,tool + nl,INF);
  84. add(tool + nl,i,0);
  85. if (tool==0)
  86. ulen++;
  87. else {
  88. while (tool) {
  89. tool/=10;
  90. ulen++;
  91. }
  92. }
  93. ulen++;
  94. }
  95. }
  96. for(int i = 1 + nl;i <= nr + nl;i++){
  97. temp = RD();
  98. add(i,t,temp);
  99. add(t,i,0);
  100. }
  101. int flow = 0;
  102. while(bfs())while(flow = Dinic(s,INF))maxflow += flow;
  103. ans = tot - maxflow;
  104. if(ans < 0){
  105. printf("0\n");
  106. return 0;
  107. }
  108. for(int i = 1;i <= nl;i++){
  109. if(d[i])printf("%d ",i);
  110. }
  111. printf("\n");
  112. for(int i = 1 + nl;i <= nr + nl;i++){
  113. if(d[i])printf("%d ",i - nl);
  114. }
  115. printf("\n");
  116. printf("%d\n",ans);
  117. return 0;
  118. }

题解 P2762 【太空飞行计划问题】的更多相关文章

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

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

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

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

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

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

  4. P2762 太空飞行计划问题 网络流

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

  5. 【luogu P2762 太空飞行计划问题】 题解

    题目链接:https://www.luogu.org/problemnew/show/P2762 算是拍照那个题的加强下. 输入真的很毒瘤.(都这么说但好像我的过了?) #include <qu ...

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

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

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

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

  8. P2762 太空飞行计划问题 最大权闭合子图

    link:https://www.luogu.org/problemnew/show/P2762 题意 承担实验赚钱,但是要花去对应仪器的费用,仪器可能共用.求最大的收益和对应的选择方案. 思路 这道 ...

  9. luogu P2762 太空飞行计划问题

    好像是最大权闭合图,也就是最大流最小割啦,找出最大流的路径输出,这题如何建模呢,一样的先设源点和汇点,源点向每个计划连capacity为赞助数的边,每个计划连相应装置capacity为无穷的边,每个装 ...

  10. P2762 太空飞行计划问题 (最小割)

    题意:n个实验 每个实验可获利ai元 做每个实验需要几个仪器 购买每个仪器有不同的花费 不同实验可能会用到同一个仪器 只用购买一次 求最大收益 题解:......................... ...

随机推荐

  1. Live Love(思维)

    DreamGrid is playing the music game Live Love. He has just finished a song consisting of n notes and ...

  2. 咱们的team1序章

    之前都参加了好多组织,这是第一次参加变成组织.首先要介绍团队名称了,为什么叫“咱们的team”呢,因为,我们需要每个人都认真的参与进来,只有每个人都十分投入地参与进来,这个team才能称之为一个tea ...

  3. Improving the Safety, Scalability, and Efficiency of Network Function State Transfers

    Improving the Safety, Scalability, and Efficiency of Network Function State Transfers 来源:ACM SIGCOMM ...

  4. 【C】多线程编程笔记

    1. pthread_create(pthread类型指针变量 ,NULL ,函数 ,函数参数[多个参数用结构体传]) 2. pthread_join(pthread类型指针变量, 返回一般为null ...

  5. 太平洋网络ip地址查询接口使用,返回json格式,默认返回jsonp

    http://whois.pconline.com.cn/ipJson.jsp?json=true

  6. C# SqlCommand和SqlDataAdapter的区别

    SqlCommand和SqlDataAdapter的区别 SqlCommand对应DateReader   SqlDataAdapter对应DataSet   SqlCommand的执行效率比较高,但 ...

  7. HDU4767_Sum Of Gcd

    通过一个题目,学到了很多. 题意为给你n个数,每次询问i,j,答案为i,j间任取两数所有的取法gcd的和. 假设我们当前要看看这个区间有多少个数的gcd为x,最最原始的想法都是查询这个区间有多少个数为 ...

  8. MachineLearning ---- lesson 2 Linear Regression with One Variable

    Linear Regression with One Variable model Representation 以上篇博文中的房价预测为例,从图中依次来看,m表示训练集的大小,此处即房价样本数量:x ...

  9. BZOJ 1264 基因匹配(DP+线段树)

    很有意思的一道题啊. 求两个序列的最大公共子序列.保证每个序列中含有1-n各5个. 如果直接LCS显然是TLE的.该题与普通的LCS不同的是每个序列中含有1-n各5个. 考虑LCS的经典DP方程.dp ...

  10. 【JavaScript&jQuery】前端资源大全

    综合类 综合类 地址 前端知识体系 http://www.cnblogs.com/sb19871023/p/3894452.html 前端知识结构 https://github.com/Jackson ...