P4012 深海机器人问题 最小费用最大流

2023-11-04 22:50

本文主要是介绍P4012 深海机器人问题 最小费用最大流,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

  

题目描述

深海资源考察探险队的潜艇将到达深海的海底进行科学考察。

潜艇内有多个深海机器人。潜艇到达深海海底后,深海机器人将离开潜艇向预定目标移动。

深海机器人在移动中还必须沿途采集海底生物标本。沿途生物标本由最先遇到它的深海机器人完成采集。

每条预定路径上的生物标本的价值是已知的,而且生物标本只能被采集一次。

本题限定深海机器人只能从其出发位置沿着向北或向东的方向移动,而且多个深海机器人可以在同一时间占据同一位置。

用一个 P\times QP×Q 网格表示深海机器人的可移动位置。西南角的坐标为 (0,0)(0,0),东北角的坐标为 (Q,P)(Q,P) 。

给定每个深海机器人的出发位置和目标位置,以及每条网格边上生物标本的价值。

计算深海机器人的最优移动方案, 使深海机器人到达目的地后,采集到的生物标本的总价值最高。

输入输出格式

输入格式:

 

文件的第 11 行为深海机器人的出发位置数 aa,和目的地数 bb 。

第 22 行为 PP 和 QQ 的值。

接下来的 P+1P+1 行,每行有 QQ 个正整数,表示向东移动路径上生物标本的价值,行数据依从南到北方向排列。

再接下来的 Q+1Q+1 行,每行有 PP 个正整数,表示向北移动路径上生物标本的价值,行数据依从西到东方向排列。

接下来的 aa 行,每行有 33 个正整数 k,x,yk,x,y,表示有 kk 个深海机器人从 (x,y)(x,y) 位置坐标出发。

再接下来的 bb 行,每行有 33 个正整数 r,x,yr,x,y ,表示有 rr 个深海机器人可选择 (x,y)(x,y) 位置坐标作为目的地。

a行和b行输入时横纵坐标要反过来

 

输出格式:

 

输出采集到的生物标本的最高总价值.

 

输入输出样例

输入样例#1:  复制
1 1
2 2
1 2
3 4
5 6
7 2
8 10
9 3
2 0 0
2 2 2
输出样例#1:  复制
42

说明

1\leq P,Q\leq151P,Q15

1\leq a\leq 41a4

1\leq b\leq 61b6

 

没啥好说的  和方格取数几乎差不多 

#include<bits/stdc++.h>
using namespace std;
//input by bxd
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define repp(i,a,b) for(int i=(a);i>=(b);--i)
#define RI(n) scanf("%d",&(n))
#define RII(n,m) scanf("%d%d",&n,&m)
#define RIII(n,m,k) scanf("%d%d%d",&n,&m,&k)
#define RS(s) scanf("%s",s);
#define ll long long
#define pb push_back
#define inf 0x3f3f3f3f
#define CLR(A,v)  memset(A,v,sizeof A)
//
const int N=100001;ll maxflow,mincost;
int last[N],pre[N],dis[N],flow[N];
bool vis[N];
struct Edge{int next,to,flow,dis;
}edge[N<<1];
int pos=1,head[N];
void init()
{pos=1;CLR(head,0);mincost=maxflow=0;
}
queue <int> q;
void add(int from,int to,int flow,int dis)//flow流量 dis费用
{edge[++pos].next=head[from];edge[pos].flow=flow;edge[pos].dis=dis;edge[pos].to=to;head[from]=pos;edge[++pos].next=head[to];edge[pos].flow=0;edge[pos].dis=-dis;edge[pos].to=from;head[to]=pos;}
bool spfa(int s,int t)
{CLR(dis,0x3f);CLR(flow,0x3f);CLR(vis,0);while (!q.empty()) q.pop();dis[s]=0; pre[t]=-1; q.push(s); vis[s]=1;int tot=0;while (!q.empty()){int now=q.front(); q.pop(); vis[now]=0;for (int i=head[now]; i; i=edge[i].next){int to=edge[i].to;if  (edge[i].flow>0 && dis[to]>dis[now]+edge[i].dis){dis[to]=edge[i].dis+dis[now];flow[to]=min(edge[i].flow,flow[now]);last[to]=i;pre[to]=now;if (!vis[to]){q.push(to); vis[to]=1;}}}}return pre[t]!=-1;
}
void MCMF(int s,int t)
{while (spfa(s,t)){int now=t;maxflow+=flow[t];mincost+=flow[t]*dis[t];while (now!=s){edge[last[now]].flow-=flow[t];//dis . flowedge[last[now]^1].flow+=flow[t];now=pre[now];}}
}
int t,n,m,s,x,y,a,b;
int id(int x,int y){return x*20+y+3;}
int main()
{s=1,t=2;RII(a,b);RII(n,m);rep(i,0,n)rep(j,0,m-1){int x;RI(x);add(id(i,j),id(i,j+1),1,-x);add(id(i,j),id(i,j+1),inf,0);}rep(j,0,m)rep(i,0,n-1){int x;RI(x);add(id(i,j),id(i+1,j),1,-x);add(id(i,j),id(i+1,j),inf,0);}rep(i,1,a){int k,x,y;RIII(k,x,y);add(s,id(x,y),k,0);}rep(i,1,b){int k,x,y;RIII(k,x,y);add(id(x,y),t,k,0);}MCMF(s,t);cout<<-mincost;return 0;
}
View Code

 

转载于:https://www.cnblogs.com/bxd123/p/10946088.html

这篇关于P4012 深海机器人问题 最小费用最大流的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:https://blog.csdn.net/weixin_30851409/article/details/95028170
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/345719

相关文章

springboot循环依赖问题案例代码及解决办法

《springboot循环依赖问题案例代码及解决办法》在SpringBoot中,如果两个或多个Bean之间存在循环依赖(即BeanA依赖BeanB,而BeanB又依赖BeanA),会导致Spring的... 目录1. 什么是循环依赖?2. 循环依赖的场景案例3. 解决循环依赖的常见方法方法 1:使用 @La

SpringBoot启动报错的11个高频问题排查与解决终极指南

《SpringBoot启动报错的11个高频问题排查与解决终极指南》这篇文章主要为大家详细介绍了SpringBoot启动报错的11个高频问题的排查与解决,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一... 目录1. 依赖冲突:NoSuchMethodError 的终极解法2. Bean注入失败:No qu

MySQL新增字段后Java实体未更新的潜在问题与解决方案

《MySQL新增字段后Java实体未更新的潜在问题与解决方案》在Java+MySQL的开发中,我们通常使用ORM框架来映射数据库表与Java对象,但有时候,数据库表结构变更(如新增字段)后,开发人员可... 目录引言1. 问题背景:数据库与 Java 实体不同步1.1 常见场景1.2 示例代码2. 不同操作

如何解决mysql出现Incorrect string value for column ‘表项‘ at row 1错误问题

《如何解决mysql出现Incorrectstringvalueforcolumn‘表项‘atrow1错误问题》:本文主要介绍如何解决mysql出现Incorrectstringv... 目录mysql出现Incorrect string value for column ‘表项‘ at row 1错误报错

如何解决Spring MVC中响应乱码问题

《如何解决SpringMVC中响应乱码问题》:本文主要介绍如何解决SpringMVC中响应乱码问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Spring MVC最新响应中乱码解决方式以前的解决办法这是比较通用的一种方法总结Spring MVC最新响应中乱码解

pip无法安装osgeo失败的问题解决

《pip无法安装osgeo失败的问题解决》本文主要介绍了pip无法安装osgeo失败的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 进入官方提供的扩展包下载网站寻找版本适配的whl文件注意:要选择cp(python版本)和你py

解决Java中基于GeoTools的Shapefile读取乱码的问题

《解决Java中基于GeoTools的Shapefile读取乱码的问题》本文主要讨论了在使用Java编程语言进行地理信息数据解析时遇到的Shapefile属性信息乱码问题,以及根据不同的编码设置进行属... 目录前言1、Shapefile属性字段编码的情况:一、Shp文件常见的字符集编码1、System编码

Spring MVC使用视图解析的问题解读

《SpringMVC使用视图解析的问题解读》:本文主要介绍SpringMVC使用视图解析的问题解读,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Spring MVC使用视图解析1. 会使用视图解析的情况2. 不会使用视图解析的情况总结Spring MVC使用视图

Redis解决缓存击穿问题的两种方法

《Redis解决缓存击穿问题的两种方法》缓存击穿问题也叫热点Key问题,就是⼀个被高并发访问并且缓存重建业务较复杂的key突然失效了,无数的请求访问会在瞬间给数据库带来巨大的冲击,本文给大家介绍了Re... 目录引言解决办法互斥锁(强一致,性能差)逻辑过期(高可用,性能优)设计逻辑过期时间引言缓存击穿:给

Java程序运行时出现乱码问题的排查与解决方法

《Java程序运行时出现乱码问题的排查与解决方法》本文主要介绍了Java程序运行时出现乱码问题的排查与解决方法,包括检查Java源文件编码、检查编译时的编码设置、检查运行时的编码设置、检查命令提示符的... 目录一、检查 Java 源文件编码二、检查编译时的编码设置三、检查运行时的编码设置四、检查命令提示符