传送门

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

总而言之,就是求一个图,每一个点有点权,闭合图就是若图中有点$u$,且原图中存在边$(u,v)$,那么点$v$也在图中。然后求一个最大权的闭合图即可(具体证明看上面)。最大权闭合图可以转化成下面那样建图之后求最小割

源点向所有实验连边,容量为收益,实验向对应仪器连边,容量为$inf$,仪器向汇点连边,容量为花费,求一个最小割就好了,然后答案就是收益总和减去最小割

然后考虑怎么求方案,因为最后一次bfs没有增广成功,而与源点想通的点就是闭合图中的点,所以只要最后一次分层图中$dep$不等于$-1$的点即可

  1. //minamoto
  2. #include<cstdio>
  3. #include<iostream>
  4. #include<cstring>
  5. #include<queue>
  6. #define inf 0x3f3f3f3f
  7. using namespace std;
  8. inline bool read(int &res){
  9. res=;char ch=getchar();
  10. while(!isdigit(ch)){if(ch=='\n') return false;ch=getchar();}
  11. while(isdigit(ch)){res=res*+ch-'',ch=getchar();}
  12. return ch!='\n';
  13. }
  14. const int N=,M=;
  15. int ver[M],Next[M],head[N],edge[M],cur[N],tot=;
  16. int dep[N],n,m,s,t,ans;
  17. queue<int> q;
  18. inline void add(int u,int v,int e){
  19. ver[++tot]=v,Next[tot]=head[u],head[u]=tot,edge[tot]=e;
  20. ver[++tot]=u,Next[tot]=head[v],head[v]=tot,edge[tot]=;
  21. }
  22. bool bfs(){
  23. memset(dep,-,sizeof(dep));
  24. for(int i=;i<=n+m+;++i) cur[i]=head[i];
  25. q.push(s),dep[s]=;
  26. while(!q.empty()){
  27. int u=q.front();q.pop();
  28. for(int i=head[u];i;i=Next[i]){
  29. int v=ver[i];
  30. if(dep[v]<&&edge[i])
  31. dep[v]=dep[u]+,q.push(v);
  32. }
  33. }
  34. return ~dep[t];
  35. }
  36. int dfs(int u,int limit){
  37. if(!limit||u==t) return limit;
  38. int flow=,f;
  39. for(int i=cur[u];i;i=Next[i]){
  40. int v=ver[i];cur[u]=i;
  41. if(dep[v]==dep[u]+&&(f=dfs(v,min(limit,edge[i])))){
  42. flow+=f,limit-=f;
  43. edge[i]-=f,edge[i^]+=f;
  44. if(!limit) break;
  45. }
  46. }
  47. return flow;
  48. }
  49. int dinic(){
  50. int flow=;
  51. while(bfs()) flow+=dfs(s,inf);
  52. return flow;
  53. }
  54. int main(){
  55. scanf("%d%d",&m,&n);
  56. s=,t=n+m+;
  57. for(int i=,x;i<=m;++i){
  58. scanf("%d",&x),ans+=x;
  59. add(s,i,x);
  60. while(read(x)) add(i,x+m,inf);
  61. add(i,x+m,inf);
  62. }
  63. for(int i=m+,x;i<=n+m;++i){
  64. scanf("%d",&x);
  65. add(i,t,x);
  66. }
  67. ans-=dinic();
  68. for(int i=;i<=m;++i)
  69. if(~dep[i]) printf("%d ",i);
  70. putchar();
  71. for(int i=m+;i<=n+m;++i)
  72. if(~dep[i]) printf("%d ",i-m);
  73. putchar();
  74. printf("%d\n",ans);
  75. return ;
  76. }

洛谷P2762 太空飞行计划问题(最小割)的更多相关文章

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  9. P2762 [网络流24题]太空飞行计划问题(最小割)

    地址 最大权闭合子图裸题,不说了吧,求方案就是把s集遍历一遍. 错误记录:dfs那块忘判断残量了,11分×1. #include<cstdio> #include<iostream& ...

随机推荐

  1. windows 10 服务组件安装出现0x80070422错误解决方法

    问题描述:   windows 10通过控制面板->程序->启用或关闭Windows 功能安装Windows服务或组件时,出现0x80070422错误,提示服务禁止或未启用 问题产生原因: ...

  2. 页面中CSS的四种引入方式的介绍与比较

    转自:https://blog.csdn.net/qq_38689666/article/details/79039392 一:行内式 <p style="color:red" ...

  3. CBV中的dispatch

    之前介绍了FBV和CBV ,下面我们看一下CBV中的dispatch dispatch函数在类View中定义,作用就是通过反射查找get或post函数,所以在执行get或post函数之前,dispat ...

  4. delphi 四舍五入

    trunc取整 四舍五入 formatfloat('0.00', 2.1850) 看第二位,然后对后面的数字处理,偶数的话舍去,奇数四舍五入 System.Math.RoundTo(tempval,- ...

  5. web页面在ios下不支持fixed可用absolute替代的方案

    本文引用出处:http://www.cnblogs.com/PeunZhang/p/3553020.html. 对于 ios4 和 android2.2 以下不支持 position:fixed 的问 ...

  6. Mesh Filter & Mesh Render

    [Mesh Filter] The Mesh Filter takes a mesh from your assets and passes it to the Mesh Renderer for r ...

  7. MobileSubstrate

    [MobileSubstrate] Cydia Substrate (formerly called MobileSubstrate) is the de facto framework that a ...

  8. inux下安装ab

    1,APR 下载地址:http://apr.apache.org/download.cgi 1)tar -zxf apr-1.4.5.tar.gz    ./configure --prefix=/u ...

  9. PHP数组在循环的时候修改本身的值

    这样的修改并不是修改本身,$item就相当于赋值了一份数组中的值,就跟JAVA中的值方式传递值类型一样,我只是拿了你的值,并不是拿了你的内存地址,所已$item的改变,并不会影响数组 第一种方式就是直 ...

  10. zend studio 字体大小修改,默认编码设置

    zend studio的字体感觉很小,很多用户不是很适应,修改方法如下: 第一步:进入设置窗口    windows -> preferences 第二步:进入修改字体的选项卡.    Gene ...