原题链接

Description

有m(m≤50)个实验和n(n≤50)个仪器,做实验有报酬买仪器有花费。每个实验都需要一些仪器,求最大净收益(实验报酬−仪器花费),并输出一组方案。

Solution

实验所需仪器连边,实验的点权是其报酬,仪器的点权是其花费的相反数,这样构成一张带权图。所求的就是这个图的最大权闭合图。

关于最大权闭合图的求法及其证明,请参照胡泽涛的《最小割模型在信息学竞赛中的应用》P16。

Code

  1. //「网络流 24 题」太空飞行计划
  2. #include <cstdio>
  3. #include <cstring>
  4. int const N=100+10;
  5. int const INF=0x7FFFFFFF;
  6. int m,n;
  7. int s,t; int cnt,h[N];
  8. struct edge{int v,c,nxt;} ed[N*N];
  9. void edAdd(int u,int v,int c)
  10. {
  11. cnt++; ed[cnt].v=v,ed[cnt].c=c,ed[cnt].nxt=h[u],h[u]=cnt;
  12. cnt++; ed[cnt].v=u,ed[cnt].c=0,ed[cnt].nxt=h[v],h[v]=cnt;
  13. }
  14. int dpt[N]; int op,cl,q[N];
  15. bool bfs()
  16. {
  17. op=cl=0; memset(dpt,0,sizeof dpt);
  18. dpt[q[++cl]=s]=1;
  19. while(op<cl)
  20. {
  21. int u=q[++op]; if(u==t) break;
  22. for(int i=h[u];i;i=ed[i].nxt)
  23. {
  24. int v=ed[i].v,c=ed[i].c;
  25. if(!dpt[v]&&c) dpt[q[++cl]=v]=dpt[u]+1;
  26. }
  27. }
  28. return dpt[t];
  29. }
  30. int min(int x,int y) {return x<y?x:y;}
  31. int fill(int u,int in)
  32. {
  33. if(u==t||in==0) return in;
  34. int out=0;
  35. for(int i=h[u];i;i=ed[i].nxt)
  36. {
  37. int v=ed[i].v,c=ed[i].c;
  38. if(dpt[v]!=dpt[u]+1||!c) continue;
  39. int fl=fill(v,min(c,in-out));
  40. if(!fl) dpt[v]=0;
  41. else out+=fl,ed[i].c-=fl,ed[i^1].c+=fl;
  42. if(in==out) return out;
  43. }
  44. return out;
  45. }
  46. int Dinic()
  47. {
  48. int ans=0;
  49. while(bfs()) ans+=fill(s,INF);
  50. return ans;
  51. }
  52. bool buy[N];
  53. int main()
  54. {
  55. scanf("%d%d",&m,&n); s=0,t=n+m+1; cnt=1;
  56. int ans=0;
  57. for(int i=1;i<=m;i++)
  58. {
  59. int c=0; scanf("%d",&c);
  60. ans+=c; edAdd(s,i,c);
  61. while(true)
  62. {
  63. char ch=getchar(); if(ch=='\n'||ch=='\r') break;
  64. int x; scanf("%d",&x); edAdd(i,m+x,INF);
  65. }
  66. }
  67. for(int i=1;i<=n;i++) {int c; scanf("%d",&c); edAdd(m+i,t,c);}
  68. ans-=Dinic();
  69. for(int i=1;i<=m;i++) if(dpt[i]) printf("%d ",i); printf("\n");
  70. for(int i=1;i<=n;i++) if(dpt[i+m]) printf("%d ",i); printf("\n");
  71. printf("%d\n",ans);
  72. return 0;
  73. }

P.S.

又是鬼畜的输入格式…

LOJ6001 - 「网络流 24 题」太空飞行计划的更多相关文章

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  8. LibreOJ #6000. 「网络流 24 题」搭配飞行员 最大匹配

    #6000. 「网络流 24 题」搭配飞行员 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: 匿名 提交提交记录统计讨论测试数据   题目描述 ...

  9. LOJ6003 - 「网络流 24 题」魔术球

    原题链接 Description 假设有根柱子,现要按下述规则在这根柱子中依次放入编号为的球. 每次只能在某根柱子的最上面放球. 在同一根柱子中,任何2个相邻球的编号之和为完全平方数. 试设计一个算法 ...

随机推荐

  1. java -cp用法

    原文出处:http://blog.csdn.net/zhuying_linux/article/details/7714194.感谢作者的分享 java -cp classpath Specify a ...

  2. JAVA中pdf转图片的方法

    JAVA中实现pdf转图片可以通过第三方提供的架包,这里介绍几种常用的,可以根据自身需求选择使用. 一.icepdf.有收费版和开源版,几种方法里最推荐的.转换的效果比较好,能识别我手头文件中的中文, ...

  3. Android更新主线程UI的两种方式handler与runOnUiThread()

    在android开发过程中,耗时操作我们会放在子线程中去执行,而更新UI是要主线程(也叫做:UI线程)来更新的,自然会遇到如何更新主线程UI的问题.如果在主线程之外的线程中直接更新页面显示常会报错.抛 ...

  4. centos下在php.ini设置时区

    错误: PHP Warning: Unknown: It is not safe to rely on the system's timezone settings. You are *require ...

  5. 【转】Linux方向职业分析

    引言: 据了解,Linux普通网络管理人员的月薪大约5000元左右,负责编程的Linux软件工程师月薪大约在8000元到12000元之间,Linux嵌入式软件开发人员的月薪大约在12000元以上. 影 ...

  6. javascript-声明对象及其属性和方法

    /* 方法一 */ var p = new Object(); //声明对象 //为对象添加属性 p.width=300; p.height=400; p.num=4; p.autotime=3; / ...

  7. python并发编程之多进程(实现)

    一.multipricessing模块的介绍 python中的多线程无法利用多核优势,如果想要充分的使用多核CPU资源,在python中大部分情况下需要用多线程,python提供了multiproce ...

  8. 常用的几个PHP加密函数

    1.前言 PHP加密方式分为单项散列加密,对称加密,非对称加密这几类. 像常用的MD5.hash.crypt.sha1这种就是单项散列加密,单项散列加密是不可逆的. 像URL编码.base64编码这种 ...

  9. 我的前端故事----关于前端数据&逻辑的思考

    最近重构了一个项目,一个基于redux模型的react-native项目,目标是在混乱的代码中梳理出一个清晰的结构来,为了实现这个目标,首先需要对项目的结构做分层处理,将各个逻辑分离出来,这里我是基于 ...

  10. 玩转spring boot——国际化

    前言 在项目开发中,可能遇到国际化的问题,而支持国际化却是一件很头疼的事.但spring boot给出了一个非常理想和方便的方案. 一.准备工作 pom.xml: <?xml version=& ...