题目链接

最大权闭合图模型,参考

具体做法是从源点向每个实验连一条流量为这个实验的报酬的边,从每个实验向这个实验需要的所有器材各连一条流量为\(INF\)的边,再从每个器材向汇点连一条流量为这个器材的费用的边。

然后跑出最小割(即最大流),用所有的报酬和减去这个最小割就行。

不知道为什么我的\(Dinic\)写的挺简洁的,但是慢的出奇。大家都是\(0ms\)就我\(33ms\)。

至于输出方案,判断一下最后一次找增广路有没有走到这个点就行了。

  1. #include <cstdio>
  2. #include <queue>
  3. using namespace std;
  4. #define INF 2147483647
  5. inline int read(int &p){
  6. int s = 0, w = 1;
  7. char ch = getchar();
  8. while(ch < '0' || ch > '9'){if(ch == '-')w = -1;ch = getchar();}
  9. while(ch >= '0' && ch <= '9') s = s * 10 + ch - '0',ch = getchar();
  10. p = s * w;
  11. return ch != '\n' && ch != '\r';
  12. }
  13. const int MAXN = 1000010;
  14. struct Edge{
  15. int next, from, to, rest;
  16. }e[MAXN];
  17. int head[MAXN], num = 1;
  18. inline void Add(int from, int to, int flow){
  19. e[++num] = (Edge){ head[from], from, to, flow }; head[from] = num;
  20. e[++num] = (Edge){ head[to], to, from, 0 }; head[to] = num;
  21. }
  22. int flow[MAXN], pre[MAXN], dfn[MAXN];
  23. int value[MAXN], cost[MAXN], servant;
  24. int n, m, s, t, a, b, now, Time, sum, ans;
  25. queue <int> q;
  26. int RoadExist(){
  27. while(q.size()) q.pop();
  28. flow[s] = INF; pre[t] = 0; q.push(s); dfn[s] = ++Time;
  29. while(q.size()){
  30. now = q.front(); q.pop();
  31. for(int i = head[now]; i; i = e[i].next)
  32. if(e[i].rest && dfn[e[i].to] != Time)
  33. dfn[e[i].to] = Time, flow[e[i].to] = min(flow[now], e[i].rest), q.push(e[i].to), pre[e[i].to] = i;
  34. }
  35. return pre[t];
  36. }
  37. int dinic(){
  38. int ans = 0;
  39. while(RoadExist()){
  40. ans += flow[t];
  41. now = t;
  42. while(now != s){
  43. e[pre[now]].rest -= flow[t];
  44. e[pre[now] ^ 1].rest += flow[t];
  45. now = e[pre[now]].from;
  46. }
  47. }
  48. return ans;
  49. }
  50. int x[MAXN], y[MAXN];
  51. int main(){
  52. s = 99999; t = 100000;
  53. read(n); read(m);
  54. for(int i = 1; i <= n; ++i){
  55. read(value[i]); Add(s, i, value[i]); sum += value[i];
  56. while(read(servant)) Add(i, servant + 500, INF);
  57. Add(i, servant + 500, INF);
  58. }
  59. for(int i = 1; i <= m; ++i)
  60. read(cost[i]);
  61. for(int i = 1; i <= m; ++i)
  62. Add(i + 500, t, cost[i]);
  63. ans = dinic();
  64. for(int i = 1; i <= n; ++i)
  65. if(dfn[i] == Time) printf("%d ", i);
  66. puts("");
  67. for(int i = 1; i <= m; ++i)
  68. if(dfn[i + 500] == Time) printf("%d ", i);
  69. puts("");
  70. printf("%d\n", sum - ans);
  71. return 0;
  72. }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. LoadRunner中执行命令行

    在LoadRunner可以使用函数system()来调用系统指令,结果同在批处理里执行一样,但是system()有个缺陷:无法获取命令的返回结果. 也许可以用`echo command > fi ...

  2. phpmyadmin打开空白

    本地phpstudy环境,打开 phpmyadmin,登陆之后,显示空白页面. 解决办法:切换为 低版本的php版本,正常登陆.

  3. GC是什么?为什么要有GC

    GC:Garbage Collection 垃圾收集器. GC就是对“不可达“的对象进行回收,释放内存. Java内存的管理实际上就是对对象的管理,其中包括对对象的分配和回收. 对于程序员来说,分配对 ...

  4. 基本数据类型(int,bool,str)

    目录: 1.int        数字类型 2.bool      布尔值 3.str    字符串类型 一.整型(int) 在python3中所有的整数都是int类型.但在python2中如果数据量 ...

  5. MySQL & export

    MySQL & export mysql export table form command line https://cn.bing.com/search?q=mysql%20export% ...

  6. JavaScript 语句标识符,变量周期,常见的HTML事件

    语句 描述 break 用于跳出循环. catch 语句块,在 try 语句块执行出错时执行 catch 语句块. continue 跳过循环中的一个迭代. do ... while 执行一个语句块, ...

  7. 窗口中各模块的切换效果,使用jquery实现

    用到了两个js库,请自行下载,用到的背景图片可任意图片都可以,主要是看效果 <!DOCTYPE html> <html> <head> <script src ...

  8. Xcode开发技巧之code snippets(代码片段)

    一.什么是代码片段 当在Xcode中输入dowhile并回车后,Xcode会出现下图所示的提示代码: 这就是代码片段,目的是使程序员以最快的速度输入常用的代码片段,提高编程效率.该功能是从Xcode4 ...

  9. Version

    题目 有三个操作: \(change \ u \ v \ a \ b\) : \(u\)到\(v\)路径上的点点权加上\(a+k*b\),\(k\)为第几个点,\(u\)为第0个点. \(query ...

  10. 楼房 洛谷1382 && codevs2995

    P1382 楼房 题目描述 地平线(x轴)上有n个矩(lou)形(fang),用三个整数h[i],l[i],r[i]来表示第i个矩形:矩形左下角为(l[i],0),右上角为(r[i],h[i]).地平 ...