[网络流24题] 洛谷P3356 火星探险问题 费用流
和深海机器人问题类似。
给出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 火星探险问题 费用流相关推荐
- 洛谷 - P3356 火星探险问题(最大费用最大流+拆点+路径打印)
题目链接:点击查看 题目大意:给出一个n*m的矩阵,每个点都有一个数字: 0:平坦无障碍 1:障碍 2:石块 现在在点(1,1)处有k个探测车,他们都要去往点(n,m)处,探测车只能向下或向右行驶,现 ...
- 网络流24题 洛谷 3355 骑士共存
转换成最小割: #include <bits/stdc++.h>using namespace std ;const int mx [ 9 ] = { 2 , 2 , -2 , -2 , ...
- 【网络流24题】餐巾计划问题(最小费用最大流)
[网络流24题]餐巾计划问题(最小费用最大流) 题面 COGS 洛谷上的数据范围更大,而且要开longlong 题解 餐巾的来源分为两种: ①新买的 ②旧的拿去洗 所以,两种情况分别建图 先考虑第一种 ...
- [费用流]洛谷 P2053 修车(zkw费用流模版)
题目描述 同一时刻有N位车主带着他们的爱车来到了汽车维修中心.维修中心共有M位技术人员,不同的技术人员对不同的车进行维修所用的时间是不同的.现在需要安排这M位技术人员所维修的车及顺序,使得顾客平均等待 ...
- 教辅的组成(网络流果题 洛谷P1231)
题目描述 蒟蒻HansBug在一本语文书里面发现了一本答案,然而他却明明记得这书应该还包含一份练习题.然而出现在他眼前的书多得数不胜数,其中有书,有答案,有练习册.已知一个完整的书册均应该包含且仅包含 ...
- 洛谷——网络流24题
P2756 飞行员配对方案问题 P2762 太空飞行计划问题 P4014 分配问题 P2774 方格取数问题 P4009 汽车加油行驶问题 P4015 运输问题 P3254 圆桌问题 P2763 试题 ...
- P3356 火星探险问题(网络流)
P3356 火星探险问题 对于一个第一次经过会有价值,但是之后经过没有价值的点,我们的处理方法就是只连一条流量为1并且有费用的边,再连接流量为INF但是没有费用的边,这样我们要使得价值最大就会优先流有 ...
- 解题报告:线性规划与网络流24题
目录 A.飞行员配对方案问题 (二分图最大匹配)(最大流)[提高+/省选- ] B.太空飞行计划问题(最大权闭合图转最小割.最小割方案输出)[省选/NOI- ] C.最小路径覆盖问题(有向无环图最小路 ...
- 「网络流24题」 题目列表
「网络流24题」 题目列表 序号 题目标题 模型 题解 1 飞行员配对方案问题 二分图最大匹配 <1> 2 太空飞行计划问题 最大权闭合子图 <2> 3 最小路径覆盖问题 二分 ...
- 软件补丁问题(网络流24题)
洛谷题目链接:软件补丁问题 题目背景 none! 题目描述 T 公司发现其研制的一个软件中有 n 个错误,随即为该软件发放了一批共 m 个补丁程序.每一个补丁程序都有其特定的适用环境,某个补丁只有在软 ...
最新文章
- android 生命周期 Activity/Fragment lifecycle
- c mysql bulk,MySqlBulkLoader批量上传遇到的问题和解决方法
- TypeScript完全解读(26课时)_14.ES6和Nodejs中的模块
- 数据挖掘竞赛,算法刷题网址汇总
- Centos 虚拟机克隆后eth0网卡打不开
- Seoer,牵起用户与搜索引擎双手的魔术师
- Linux的sleep()和usleep()的使用和区别
- win10安装wget
- 【模拟考勤打卡程序vim报错分享】
- 百度云安装mysql_mysql5.7 安装版本配置教程+百度云资源分享
- 盘点最近 火火火 的 7 个 GitHub 项目
- 面向模式的软件体系结构(卷1-5
- NOIP2015总结
- Mac—删除默认英文输入法
- MySQL引擎:InnoDB VS MyISAM
- fmm3d在windows环境中的编译使用过程
- Cocos Creator 开发实战——篮球物理游戏
- IE11 error object doesn't support property or method 'fill'
- python量化交易:Joinquant_量化交易基础【三】:python基本语法与变量
- 【Android Gradle 插件】ProductFlavor 配置 ( consumerProguardFiles 配置 | dimension 配置 )