题意

有$m$个实验,$n$中器材,每个实验需要使用一些器材

每个实验有收入,每个器材有花费

最大化收入 - 花费

Sol

最大权闭合图的经典应用

从$S$向每个实验连流量为该实验收入的边

从每个器材箱$T$连流量为花费的边

每个实验向其需要其器材连边权为$INF$的边

答案为:总收入 - 最小割

考虑如何统计方案

在最小割中,割去实验表示不选该实验。

那么我们从源点出发,不经过边权为$0$的边,走到的就是需要选的。

这正好是Dinic最后一次增光的deep数组

  1. #include<cstdio>
  2. #include<queue>
  3. #include<cstring>
  4. using namespace std;
  5. const int MAXN = 1e5 + , INF = 1e9 + ;
  6. char c;
  7. inline int read() {
  8. if(c == '\r') return ;
  9. c = getchar(); int x = , f = ;
  10. while(c < '' || c > '') {if(c == '-') f = -; c = getchar();}
  11. while(c >= '' && c <= '') x = x * + c - '', c = getchar();
  12. return x * f;
  13. }
  14. int M, N, S, T;
  15. struct Edge {
  16. int u, v, f, nxt;
  17. }E[MAXN];
  18. int head[MAXN], cur[MAXN], num;
  19. inline void add_edge(int x, int y, int f) {
  20. E[num] = (Edge){x, y, f, head[x]};
  21. head[x] = num++;
  22. }
  23. inline void AddEdge(int x, int y, int z) {
  24. add_edge(x, y, z);
  25. add_edge(y, x, );
  26. }
  27. int sum = , deep[MAXN];
  28. bool BFS() {
  29. queue<int> q; q.push(S);
  30. memset(deep, , sizeof(deep)); deep[S] = ;
  31. while(!q.empty()) {
  32. int p = q.front(); q.pop();
  33. for(int i = head[p]; i != -; i = E[i].nxt) {
  34. int to = E[i].v;
  35. if(!deep[to] && E[i].f) {
  36. deep[to] = deep[p] + ;
  37. q.push(to);
  38. }
  39. }
  40. }
  41. return deep[T] > ;
  42. }
  43. int DFS(int x, int flow) {
  44. if(x == T) return flow;
  45. int ansflow = ;
  46. for(int &i = cur[x]; i != -; i = E[i].nxt) {
  47. int to = E[i].v;
  48. if(deep[to] == deep[x] + && E[i].f) {
  49. int nowflow = DFS(to, min(flow, E[i].f));
  50. E[i].f -= nowflow; E[i ^ ].f += nowflow;
  51. ansflow += nowflow; flow -= nowflow;
  52. if(flow <= ) break;
  53. }
  54. }
  55. return ansflow;
  56. }
  57. int Dinic() {
  58. int ans = ;
  59. while(BFS()) {
  60. memcpy(cur, head, sizeof(head));
  61. ans += DFS(S, INF);
  62. }
  63. return ans;
  64. }
  65. int main() {
  66. memset(head, -, sizeof(head));
  67. scanf("%d %d\n", &M, &N); S = ; T = N + M + ;
  68. int ans = ;
  69. for(int i = ; i <= M; i++) {
  70. c = '+';
  71. int val = read(), x; ans += val;
  72. AddEdge(S, i, val);
  73. while(x = read())
  74. AddEdge(i, x + M, INF);
  75. }
  76. for(int i = ; i <= N; i++) {
  77. int x; scanf("%d", &x);
  78. AddEdge(i + M, T, x);
  79. }
  80. int cut = Dinic();
  81. for(int i = head[S]; i != -; i = E[i].nxt)
  82. if(E[i].f)
  83. printf("%d ", E[i].v); puts("");
  84. for(int x = M + ; x <= N + M; x++)
  85. for(int i = head[x]; i != -; i = E[i].nxt)
  86. if(E[i].f)
  87. {printf("%d ", x - M); break;}
  88. puts("");
  89. printf("%d", ans - cut);
  90. return ;
  91. }

洛谷P2762 太空飞行计划问题(最大权闭合图)的更多相关文章

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

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

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

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

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

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

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

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

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

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

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

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

  7. 洛谷P2762 太空飞行计划问题

    这题套路好深......没想渠. 题意:给你若干个设备,若干个任务. 每个任务需要若干设备,设备可重复利用. 完成任务有钱,买设备要钱. 问最大总收益(可以什么任务都不做). 解:最大权闭合子图. 对 ...

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

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

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

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

随机推荐

  1. e.target与e.currentTarget的区别

    在DOM事件对象中有两个属性总是时不时的困扰我,就是target和currentTarget,有时候很迷惑分不清两者的区别,因此有必要把这两个属性好好梳理一下,加深理解,以便日后的查询. MDN中对t ...

  2. XMLHttp.send()不传参时必须传null吗?

    xmlhttp的send是传递参数用的,但是只有在使用post方式提交请求的时候才有用如下:xmlhttp.open("post",url,true); ...xmlhttp.se ...

  3. MYSQL进阶学习笔记九:MySQL事务的应用!(视频序号:进阶_21-22)

    知识点十:MySQL 事务的应用 (21-22) 为什么要引入事务: 为什么要引入事务这个技术呢?现在的很多软件都是多用户,多程序,多线程的.对同一表可能同时有很多人在用,为保持数据的一致性,所以提出 ...

  4. hdu acm 1114 Piggy-Bank 解题报告

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1114 题目意思:给出一个空的猪仔钱ang 的重量E,和一个装满钱的猪仔钱ang 的重量F你,实质上能装 ...

  5. jsp项目上传到服务器

    我们通过Myeclipse完成一个Java web项目时只能通过本地访问来查看,但是我们想把它上传到服务器上使用外网访问应该怎么做呢,首先肯定是要有一台服务器 个人调试项目试手的话我建议去买阿里云的云 ...

  6. 西门子PLC存储器、地址区

    S7-1500 CPU的存储器 1.内部集成的存储器:工作存储器,保持性存储器,系统存储器 2.外插的SIMATIC存储卡:装载存储器去 装载存储器:断电信息不丢失,主要存储项目中程序块,数据块,工艺 ...

  7. http的安全方法和幂等性

    最近在研究http,看到http的安全方法和幂等性部分,不太明白,尤其是"post方法是非幂等的"不理解,进过查资料,找到以下两篇有价值的文章,特转过来! 理解HTTP幂等性 转自 ...

  8. function.py

    #文档字符串 def square(x): 'calculates the square of the number x' return x*x square.__doc__ help(square) ...

  9. 「NOIP2014」「LuoguP2296」 寻找道路

    Description 在有向图 G 中,每条边的长度均为 1 ,现给定起点和终点,请你在图中找一条从起点到终点的路径,该路径满足以下条件: 路径上的所有点的出边所指向的点都直接或间接与终点连通. 在 ...

  10. Eclipse中,open declaration;open implementation;open super implementation的区别

    open declaration:是打开该方法的接口文件(一般没实在意义,只是简单一句):open implementation:是打开具体实现该方法的类文件(具体逻辑的处理地方,方法的主要实现的地方 ...