输出方案好麻烦啊

拆点,石头的连(i,i',1,1)(i,i',inf,0)表示可以取一次价值1,空地直接连(i,i',inf,0),对于能走到的两个格子(不包括障碍),连接(i',j,inf,0),然后连接s和起点,终点和t,流量为探测车的数量。然后跑最大费用最大流。

关于输出方案,dfs即可,每经过一次就把反向边的流量减一即可,注意不要输出i'

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<queue>
  5. using namespace std;
  6. const int N=1000005,inf=1e9;
  7. int q,n,m,a[40][40],bs,h[N],cnt=1,dis[N],fr[N],s,t,ans,sum;
  8. bool v[N];
  9. struct qwe
  10. {
  11. int ne,no,to,va,c;
  12. }e[N<<2];
  13. int read()
  14. {
  15. int r=0,f=1;
  16. char p=getchar();
  17. while(p>'9'||p<'0')
  18. {
  19. if(p=='-')
  20. f=-1;
  21. p=getchar();
  22. }
  23. while(p>='0'&&p<='9')
  24. {
  25. r=r*10+p-48;
  26. p=getchar();
  27. }
  28. return r*f;
  29. }
  30. void add(int u,int v,int w,int c)
  31. {
  32. cnt++;
  33. e[cnt].ne=h[u];
  34. e[cnt].no=u;
  35. e[cnt].to=v;
  36. e[cnt].va=w;
  37. e[cnt].c=c;
  38. h[u]=cnt;
  39. }
  40. void ins(int u,int v,int w,int c)
  41. {
  42. add(u,v,w,c);
  43. add(v,u,0,-c);
  44. }
  45. bool spfa()
  46. {
  47. queue<int>q;
  48. for(int i=s;i<=t;i++)
  49. dis[i]=-inf;
  50. dis[s]=0;
  51. v[s]=1;
  52. q.push(s);
  53. while(!q.empty())
  54. {
  55. int u=q.front();
  56. q.pop();
  57. v[u]=0;
  58. for(int i=h[u];i;i=e[i].ne)
  59. if(e[i].va>0&&dis[e[i].to]<dis[u]+e[i].c)
  60. {
  61. dis[e[i].to]=dis[u]+e[i].c;
  62. fr[e[i].to]=i;
  63. if(!v[e[i].to])
  64. {
  65. v[e[i].to]=1;
  66. q.push(e[i].to);
  67. }
  68. }
  69. }
  70. return dis[t]!=-inf;
  71. }
  72. void mcf()
  73. {
  74. int x=inf;
  75. for(int i=fr[t];i;i=fr[e[i].no])
  76. x=min(x,e[i].va);
  77. for(int i=fr[t];i;i=fr[e[i].no])
  78. {
  79. e[i].va-=x;
  80. e[i^1].va+=x;
  81. ans+=e[i].c*x;
  82. }
  83. sum+=x;
  84. }
  85. void dfs(int x,int y,int u,int k)
  86. {
  87. int kx,ky,mv;
  88. for(int i=h[u];i;i=e[i].ne)
  89. if(e[i].to!=s&&e[i].to!=t&&e[i].to!=u-bs&&e[i^1].va>0)
  90. {
  91. e[i^1].va--;
  92. if(e[i].to>bs)
  93. {
  94. dfs(x,y,e[i].to,k);
  95. return;
  96. }
  97. if(e[i].to==(x-1)*n+y+1)
  98. kx=x,ky=y+1,mv=1;
  99. else
  100. kx=x+1,ky=y,mv=0;
  101. printf("%d% d\n",k,mv);
  102. dfs(kx,ky,e[i].to+bs,k);
  103. return;
  104. }
  105. }
  106. int main()
  107. {
  108. q=read(),n=read(),m=read();
  109. bs=n*m,s=0,t=n*m+bs+1;
  110. for(int i=1;i<=m;i++)
  111. for(int j=1;j<=n;j++)
  112. a[i][j]=read();
  113. for(int i=1;i<=m;i++)
  114. for(int j=1;j<=n;j++)
  115. if(a[i][j]!=1)
  116. {
  117. int id=(i-1)*n+j;
  118. if(a[i][j]==2)
  119. ins(id,id+bs,1,1);
  120. ins(id,id+bs,inf,0);
  121. if(i!=m&&a[i+1][j]!=1)
  122. ins(id+bs,id+n,inf,0);
  123. if(j!=n&&a[i][j+1]!=1)
  124. ins(id+bs,id+1,inf,0);
  125. }
  126. if(a[1][1]!=1)
  127. ins(s,1,q,0);
  128. if(a[m][n]!=1)
  129. ins(n*m+bs,t,q,0);
  130. while(spfa())
  131. mcf();
  132. for(int i=1;i<=sum;i++)
  133. dfs(1,1,1,i);
  134. return 0;
  135. }

洛谷 P3356 火星探险问题 【最大费用最大流】的更多相关文章

  1. 洛谷P3356 火星探险问题(费用流)

    传送门 和深海机器人问题差不多……看到有的大佬是用dp过的,强无敌…… 考虑一下,把每一个点拆点,分别是$A_i$和$B_i$,连一条容量为$inf$,费用为$0$的边,表示可以随便走.如果有石头,再 ...

  2. 洛谷P3356 火星探险问题(费用流)

    题目描述 火星探险队的登陆舱将在火星表面着陆,登陆舱内有多部障碍物探测车.登陆舱着陆后,探测车将离开登陆舱向先期到达的传送器方向移动.探测车在移动中还必须采集岩石标本.每一块岩石标本由最先遇到它的探测 ...

  3. 洛谷P3381 - 【模板】最小费用最大流

    原题链接 题意简述 模板题啦~ 题解 每次都以费用作为边权求一下最短路,然后沿着最短路增广. Code //[模板]最小费用最大流 #include <cstdio> #include & ...

  4. 洛谷 P2053 [SCOI2007]修车(最小费用最大流)

    题解 最小费用最大流 n和m是反着的 首先, \[ ans = \sum{cost[i][j]}*k \] 其中,\(k\)为它在当前技术人员那里,排倒数第\(k\)个修 我们可以对于每个技术人员进行 ...

  5. 【Luogu】P3356火星探险问题(费用流)

    题目链接 网络流一条边都不能多连?没道理呀? 不过单看这题的确是个sb题…… #include<cstdio> #include<algorithm> #include< ...

  6. 洛谷 P3381【模板】最小费用最大流

    题目描述 如题,给出一个网络图,以及其源点和汇点,每条边已知其最大流量和单位流量费用,求出其网络最大流和在最大流情况下的最小费用. 输入输出格式 输入格式: 第一行包含四个正整数N.M.S.T,分别表 ...

  7. 洛谷 P3381 【模板】最小费用最大流

    题目描述 如题,给出一个网络图,以及其源点和汇点,每条边已知其最大流量和单位流量费用,求出其网络最大流和在最大流情况下的最小费用. 输入输出格式 输入格式: 第一行包含四个正整数\(N.M.S.T\) ...

  8. 洛谷P1251 餐巾计划问题(最小费用最大流)

    题意 一家餐厅,第$i$天需要$r_i$块餐巾,每天获取餐巾有三种途径 1.以$p$的费用买 2.以$f$的费用送到快洗部,并在$m$天后取出 3.以$s$的费用送到慢洗部,并在$n$天后取出 问满足 ...

  9. 洛谷P4016 负载平衡问题(最小费用最大流)

    题目描述 GG 公司有 nn 个沿铁路运输线环形排列的仓库,每个仓库存储的货物数量不等.如何用最少搬运量可以使 nn 个仓库的库存数量相同.搬运货物时,只能在相邻的仓库之间搬运. 输入输出格式 输入格 ...

随机推荐

  1. Maven 手动添加本地jar包

    mvn install:install-file -Dfile=jar绝对路径 -DgroupId=项目组织唯一的标识符 -DartifactId=项目的唯一的标识符 -Dversion=jar版本 ...

  2. Codeforces 703C(计算几何)

    C. Chris and Road time limit per test 2 seconds memory limit per test 256 megabytes input standard i ...

  3. C. Day at the Beach---cf559

    http://codeforces.com/problemset/problem/599/C 题目大意: 有n个城堡的高度   让你最多分成几个块   每个块排过序之后 整体是按照升序来的 分析:   ...

  4. 异常处理(try catch throw)详解(C++)

    选择异常处理的编程方法的具体原因如下: 1.把错误处理和真正的工作分开来: 2.代码更易组织,更清晰,复杂的工作任务更容易实现: 3.毫无疑问,更安全了,不至于由于一些小的疏忽而使程序意外崩溃了: 4 ...

  5. how to read openstack code: service plugin

    We have learned core plugin, service plugin and extension in last post. Now let`s review: Core Plugi ...

  6. 实例 mount新硬盘方法

    0.建立挂载文件夹: mkdir /mnt/sdb1 1 .查看新硬盘: fdisk -l 2. 硬盘分区: fdisk /dev/sdb1 根据提示,依次输入 n, p, 1, 以及两次回车,然后是 ...

  7. 关于Scrum

    最近某些产品经理发出下两周的工作计划的时候,喜欢带上sprint这个字眼,看上去貌似是要走敏捷开发这一套,只可惜,我觉得他表现出来的是对敏捷开发和Scrum一窍不通,甚至对软件开发流程都完全不清楚,居 ...

  8. 如何将Python的py程序打包成跨平台的exe文件

    在编写了自己的第一个可以爬写网页源代码的程序之后,发现如果在没有安装了pythonLDLE程序的计算机上根本就跑不出来.所以开始寻找可以将程序打包成跨平台运行的exe文件. 经过自己费力的谷歌没有一个 ...

  9. PADs 元器件PCB建库

    直接看图就好了,上图! 有几点需要记住的: 如果没有datasheet的情况下,与焊盘相比,阻焊大0.1mm,钢网小0.1mm.或者阻焊大0.05mm,钢网等大,具体要看引脚的间距. 焊盘太大,比如1 ...

  10. C++常用的函数,好的博客文章整理,集锦

    http://www.cnblogs.com/xianghang123/archive/2011/08/24/2152404.html    c语言产生随机数的方法 http://blog.sina. ...