题目描述

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. #include<queue>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<iostream>
  5. #include<algorithm>
  6. const int oo=0x3f3f3f3f;
  7. struct pnt{
  8. int hd;
  9. int lyr;
  10. int now;
  11. }p[];
  12. struct ent{
  13. int twd;
  14. int lst;
  15. int vls;
  16. }e[];
  17. int cnt;
  18. int n,m;
  19. int s,t;
  20. int sum;
  21. char tmp[];
  22. std::queue<int>Q;
  23. void ade(int f,int t,int v)
  24. {
  25. cnt++;
  26. e[cnt].twd=t;
  27. e[cnt].vls=v;
  28. e[cnt].lst=p[f].hd;
  29. p[f].hd=cnt;
  30. return ;
  31. }
  32. bool Bfs(void)
  33. {
  34. while(!Q.empty())
  35. Q.pop();
  36. for(int i=;i<=t;i++)
  37. p[i].lyr=;
  38. p[s].lyr=;
  39. Q.push(s);
  40. while(!Q.empty())
  41. {
  42. int x=Q.front();
  43. Q.pop();
  44. for(int i=p[x].hd;i;i=e[i].lst)
  45. {
  46. int to=e[i].twd;
  47. if(p[to].lyr==&&e[i].vls>)
  48. {
  49. p[to].lyr=p[x].lyr+;
  50. if(to==t)
  51. return true;
  52. Q.push(to);
  53. }
  54. }
  55. }
  56. return false;
  57. }
  58. int Dfs(int x,int fll)
  59. {
  60. if(x==t)
  61. return fll;
  62. for(int& i=p[x].now;i;i=e[i].lst)
  63. {
  64. int to=e[i].twd;
  65. if(p[to].lyr==p[x].lyr+&&e[i].vls>)
  66. {
  67. int ans=Dfs(to,std::min(fll,e[i].vls));
  68. if(ans>)
  69. {
  70. e[i].vls-=ans;
  71. e[((i-)^)+].vls+=ans;
  72. return ans;
  73. }
  74. }
  75. }
  76. return ;
  77. }
  78. int Dinic(void)
  79. {
  80. int ans=;
  81. while(Bfs())
  82. {
  83. int dlt;
  84. for(int i=;i<=t;i++)
  85. p[i].now=p[i].hd;
  86. while(dlt=Dfs(s,oo))
  87. ans+=dlt;
  88. }
  89. return ans;
  90. }
  91. int main()
  92. {
  93. // freopen("a.in","r",stdin);
  94. scanf("%d%d",&m,&n);
  95. s=n+m+;
  96. t=s+;
  97. for(int i=;i<=m;i++)
  98. {
  99. int v;
  100. scanf("%d",&v);
  101. sum+=v;
  102. ade(s,i,v);
  103. ade(i,s,);
  104. int len=;
  105. memset(tmp,,sizeof(tmp));
  106. std::cin.getline(tmp,);
  107. while(sscanf(tmp+len,"%d",&v)==)
  108. {
  109. ade(i,v+m,oo);
  110. ade(v+m,i,);
  111. if(v==)len++;
  112. else{
  113. while(v)
  114. {
  115. len++;
  116. v/=;
  117. }
  118. }
  119. len++;
  120. }
  121. }
  122. for(int i=;i<=n;i++)
  123. {
  124. int v;
  125. scanf("%d",&v);
  126. ade(i+m,t,v);
  127. ade(t,i+m,);
  128. }
  129. int ans=Dinic();
  130. for(int i=;i<=m;i++)
  131. {
  132. if(p[i].lyr>)
  133. printf("%d ",i);
  134. }
  135. puts("");
  136. for(int i=;i<=n;i++)
  137. {
  138. if(p[i+m].lyr>)
  139. printf("%d ",i);
  140. }
  141. puts("");
  142. printf("%d\n",sum-ans);
  143. return ;
  144. }

LuoguP2762 太空飞行计划问题(最大权闭合子图,最小割)的更多相关文章

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

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

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

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

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

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

  4. 【最大权闭合子图 最小割】bzoj1497: [NOI2006]最大获利

    最大权闭合子图的模型:今天才发现dinic板子是一直挂的…… Description 新的技术正冲击着手机通讯市场,对于各大运营商来说,这既是机遇,更是挑战.THU集团旗下的CS&T通讯公司在 ...

  5. bzoj 1497 [NOI2006]最大获利【最大权闭合子图+最小割】

    不要被5s时限和50000点数吓倒!大胆网络流!我一个5w级别的dinic只跑了1s+! 看起来没有最大权闭合子图的特征--限制,实际上还是有的. 我们需要把中转站看成负权点,把p看成点权,把客户看成 ...

  6. BZOJ 1565 / P2805 [NOI2009]植物大战僵尸 (最大权闭合子图 最小割)

    题意 自己看吧 BZOJ传送门 分析 - 这道题其实就是一些点,存在一些二元限制条件,即如果要选uuu则必须选vvv.求得到的权值最大是多少. 建一个图,如果选uuu必须选vvv,则uuu向vvv连边 ...

  7. 【Luogu】P2762太空飞行计划(最大权闭合图)

    题目链接 woc这题目的输入格式和输出格式真的恶心 首先我们就着样例讲一下闭合图 如图所示,第一层是两个实验节点,带来正收益:第二层是三个仪器节点,带来负收益:问讲道理到终点可以获得多大收益. 闭合图 ...

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

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

  9. 【最大权闭合子图/最小割】BZOJ3438-小M的作物【待填】

    [题目大意] 小M在MC里开辟了两块巨大的耕地A和B(你可以认为容量是无穷),现在,小P有n中作物的种子,每种作物的种子有1个(就是可以种一棵作物)(用1...n编号),现在,第i种作物种植在A中种植 ...

随机推荐

  1. 冒泡排序php

    <meta http-equiv="Content-Type" content="text/html;charset=UTF-8" /> <b ...

  2. 一个Web报表项目的性能分析和优化实践(二):MySQL数据库连接不够用(TooManyConnections)问题的一次分析和解决案例

    最近,项目中遇到了数据库连接不够的问题. 异常信息com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Data ...

  3. 利用NSProxy解决NSTimer内存泄漏问题

    之前写过一篇利用RunTime解决由NSTimer导致的内存泄漏的文章,最近和同事讨论觉得这样写有点复杂,然后发现有NSProxy这么好用的根类,根类,根类,没错NSProxy与NSObject一样是 ...

  4. 百度LBS开放平台个性化地图 制作一款独一无二的地图

    百度LBS开放平台个性化地图  制作一款独一无二的地图 天天用百度地图的亲们是否已不再满足仅仅看例如以下的地图样式了呢? 默认百度地图样式 是否特别渴望看特别不一样的地图呢.如带京城81号气息的午夜蓝 ...

  5. Codeforces 528A Glass Carving STL模拟

    题目链接:点击打开链接 题意: 给定n*m的矩阵.k个操作 2种操作: 1.H x 横向在x位置切一刀 2.V y 竖直在y位置切一刀 每次操作后输出最大的矩阵面积 思路: 由于行列是不相干的,所以仅 ...

  6. Qt creator 编译错误 :cannot find file .pro qt

    事实上问题的解决的方法非常easy:就是Qt不支持中文的路径,把源代码的路径所有改成英文就可以解决这个问题. 首先问题发生在我执行网上的样例程序时,又一次构建编译也是出错.提示: Cannot fin ...

  7. 解决Android Studio 2.2.3中添加.cpp .h文件在Project->Android无法显示,无法正常编译问题。

    搭配使用 Android Studio 2.2 或更高版本与 Android Plugin for Gradle 版本 2.2.0 或更高版本时,您可以将 C 和 C++ 代码编译到 Gradle 与 ...

  8. Integer 和 int的种种比较

    public static void main(String[] args) { int i = 128; Integer i2 = 128; Integer i3 = new Integer(128 ...

  9. 35.QQ大数据模型

    #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <stri ...

  10. BZOJ 3236 莫队+树状数组

    思路: 莫队+树状数组 (据说此题卡常数) yzy写了一天(偷笑) 复杂度有点儿爆炸 O(msqrt(n)logn) //By SiriusRen #include <cmath> #in ...