和深海机器人问题类似。
给出P×QP×QP×Q的图,P,Q≤35P,Q\leq35P,Q≤35。一些点是可以通行的,一些点是障碍,另外一些点则代表自己是矿产,每个矿产只会被拿走一次。现在有n≤35n\leq35n≤35个机器人,他们从(1,1)(1,1)(1,1)出发走到(P,Q)(P,Q)(P,Q),输出拿走最多矿产的方案。
和深海机器人类似的做法,区别在于这里需要拆点。对于障碍点的流量为000,非障碍点都连无限流量和000的费用。如果有矿产则连上111流量和矿产价值的费用。
先求出能拿走多少矿产。然后输出每次的路径,从(1,1)(1,1)(1,1)出发,记录每条边被用的次数,反向边的流量就是这条边走过的流量,然后搜索打印路径。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int inf=0x3f3f3f3f;
const int N=40;
int len=0;
int a[N][N],mp[N][N],cnt=0;
int ans[140];
namespace MCMF {const int N=1e4,M=2e5;int tot=-1,n,S,T; int front[N],pre[N],lst[N];ll flow[N],dis[N];bool inq[N];struct edge{ int v,nxt;ll c,w; }e[2*M];int used[2*M]; void init() {tot=-1;for(int i=1;i<=n;i++) front[i]=-1;}void add(int u,int v,ll c,ll w) {e[++tot].v=v,e[tot].w=w,e[tot].c=c,e[tot].nxt=front[u],front[u]=tot;e[++tot].v=u,e[tot].w=-w,e[tot].c=0,e[tot].nxt=front[v],front[v]=tot;}void reset() {pre[T]=-1;for(int i=1;i<=n;i++) dis[i]=flow[i]=inf;for(int i=1;i<=n;i++) inq[i]=0;}bool spfa() {reset();queue<int> q;q.push(S);inq[S]=1;dis[S]=0;while(!q.empty()) {int u=q.front();q.pop();inq[u]=0;for(int i=front[u];i!=-1;i=e[i].nxt) {int v=e[i].v;if(e[i].c>0) {if(dis[v]>dis[u]+e[i].w) {dis[v]=dis[u]+e[i].w;flow[v]=min(flow[u],e[i].c);pre[v]=u,lst[v]=i;if(!inq[v]) {inq[v]=1;q.push(v);}}}}}return pre[T]!=-1?1:0; }pair<ll,ll> solve() {ll maxflow=0,mincost=0;while(spfa()) {int cur=T;maxflow+=flow[T];mincost+=flow[T]*dis[T];while(cur!=S) {e[lst[cur]].c-=flow[T];e[lst[cur]^1].c+=flow[T];cur=pre[cur];}}return make_pair(maxflow,mincost);} void dfs(int x,int y) {int now=mp[x][y]+cnt;int dow=mp[x+1][y];int rig=mp[x][y+1];for(int i=front[now];i!=-1;i=e[i].nxt) {if(used[i]>=e[i^1].c) continue;if(e[i].v==dow) {++used[i];ans[++len]=0;dfs(x+1,y);return;}if(e[i].v==rig) {++used[i];ans[++len]=1;dfs(x,y+1);return;}}}
}
int main() {int n;int P,Q;scanf("%d%d%d",&n,&P,&Q);MCMF::n=2*P*Q+2;int S=2*P*Q+1;int T=2*P*Q+2;MCMF::S=S;MCMF::T=T;MCMF::init();for(int i=1;i<=Q;i++) {for(int j=1;j<=P;j++) {  scanf("%d",&a[i][j]);mp[i][j]=++cnt;}}MCMF::add(S,1,n,0);MCMF::add(2*cnt,T,n,0);for(int i=1;i<=Q;i++) {for(int j=1;j<=P;j++) {if(a[i][j]!=1) MCMF::add(mp[i][j],mp[i][j]+cnt,1e9,0); if(a[i][j]==2) MCMF::add(mp[i][j],mp[i][j]+cnt,1,-1);}}for(int i=1;i<=Q;i++) {for(int j=1;j<=P;j++) { if(i<Q) MCMF::add(mp[i][j]+cnt,mp[i+1][j],1e9,0);if(j<P) MCMF::add(mp[i][j]+cnt,mp[i][j+1],1e9,0);}}int flow=-MCMF::solve().second;for(int i=1;i<=flow;i++) {len=0;MCMF::dfs(1,1);for(int j=1;j<=len;j++)printf("%d %d\n",i,ans[j]);}return 0;
}

[网络流24题] 洛谷P3356 火星探险问题 费用流相关推荐

  1. 洛谷 - P3356 火星探险问题(最大费用最大流+拆点+路径打印)

    题目链接:点击查看 题目大意:给出一个n*m的矩阵,每个点都有一个数字: 0:平坦无障碍 1:障碍 2:石块 现在在点(1,1)处有k个探测车,他们都要去往点(n,m)处,探测车只能向下或向右行驶,现 ...

  2. 网络流24题 洛谷 3355 骑士共存

    转换成最小割: #include <bits/stdc++.h>using namespace std ;const int mx [ 9 ] = { 2 , 2 , -2 , -2 , ...

  3. 【网络流24题】餐巾计划问题(最小费用最大流)

    [网络流24题]餐巾计划问题(最小费用最大流) 题面 COGS 洛谷上的数据范围更大,而且要开longlong 题解 餐巾的来源分为两种: ①新买的 ②旧的拿去洗 所以,两种情况分别建图 先考虑第一种 ...

  4. [费用流]洛谷 P2053 修车(zkw费用流模版)

    题目描述 同一时刻有N位车主带着他们的爱车来到了汽车维修中心.维修中心共有M位技术人员,不同的技术人员对不同的车进行维修所用的时间是不同的.现在需要安排这M位技术人员所维修的车及顺序,使得顾客平均等待 ...

  5. 教辅的组成(网络流果题 洛谷P1231)

    题目描述 蒟蒻HansBug在一本语文书里面发现了一本答案,然而他却明明记得这书应该还包含一份练习题.然而出现在他眼前的书多得数不胜数,其中有书,有答案,有练习册.已知一个完整的书册均应该包含且仅包含 ...

  6. 洛谷——网络流24题

    P2756 飞行员配对方案问题 P2762 太空飞行计划问题 P4014 分配问题 P2774 方格取数问题 P4009 汽车加油行驶问题 P4015 运输问题 P3254 圆桌问题 P2763 试题 ...

  7. P3356 火星探险问题(网络流)

    P3356 火星探险问题 对于一个第一次经过会有价值,但是之后经过没有价值的点,我们的处理方法就是只连一条流量为1并且有费用的边,再连接流量为INF但是没有费用的边,这样我们要使得价值最大就会优先流有 ...

  8. 解题报告:线性规划与网络流24题

    目录 A.飞行员配对方案问题 (二分图最大匹配)(最大流)[提高+/省选- ] B.太空飞行计划问题(最大权闭合图转最小割.最小割方案输出)[省选/NOI- ] C.最小路径覆盖问题(有向无环图最小路 ...

  9. 「网络流24题」 题目列表

    「网络流24题」 题目列表 序号 题目标题 模型 题解 1 飞行员配对方案问题 二分图最大匹配 <1> 2 太空飞行计划问题 最大权闭合子图 <2> 3 最小路径覆盖问题 二分 ...

  10. 软件补丁问题(网络流24题)

    洛谷题目链接:软件补丁问题 题目背景 none! 题目描述 T 公司发现其研制的一个软件中有 n 个错误,随即为该软件发放了一批共 m 个补丁程序.每一个补丁程序都有其特定的适用环境,某个补丁只有在软 ...

最新文章

  1. android 生命周期 Activity/Fragment lifecycle
  2. c mysql bulk,MySqlBulkLoader批量上传遇到的问题和解决方法
  3. TypeScript完全解读(26课时)_14.ES6和Nodejs中的模块
  4. 数据挖掘竞赛,算法刷题网址汇总
  5. Centos 虚拟机克隆后eth0网卡打不开
  6. Seoer,牵起用户与搜索引擎双手的魔术师
  7. Linux的sleep()和usleep()的使用和区别
  8. win10安装wget
  9. 【模拟考勤打卡程序vim报错分享】
  10. 百度云安装mysql_mysql5.7 安装版本配置教程+百度云资源分享
  11. 盘点最近 火火火 的 7 个 GitHub 项目
  12. 面向模式的软件体系结构(卷1-5
  13. NOIP2015总结
  14. Mac—删除默认英文输入法
  15. MySQL引擎:InnoDB VS MyISAM
  16. fmm3d在windows环境中的编译使用过程
  17. Cocos Creator 开发实战——篮球物理游戏
  18. IE11 error object doesn't support property or method 'fill'
  19. python量化交易:Joinquant_量化交易基础【三】:python基本语法与变量
  20. 【Android Gradle 插件】ProductFlavor 配置 ( consumerProguardFiles 配置 | dimension 配置 )

热门文章

  1. 爱国者u盘linux驱动,爱国者u盘驱动
  2. 计算机指令定时关机,电脑使用命令设置定时关机
  3. 自行车电动自行车|GCC认证办理流程
  4. (web前端每日一练)用JavaScript制作一个跟随鼠标的小球炫彩动画 /doge/doge
  5. 【富文本】如何设置U盘为第一启动项,在安装windows操作系统时如何从U盘启动?
  6. 会让你变得与众不同的22个技巧
  7. java 获取今天是星期几
  8. PC浏览器模拟手机浏览器访问网站
  9. Salesforce中国区或将解散!一代CRM巨头退出中国市场?
  10. Dim Temp%的意思