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 深海机器人问题 最小费用最大流的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/345719

相关文章

怎样通过分析GC日志来定位Java进程的内存问题

《怎样通过分析GC日志来定位Java进程的内存问题》:本文主要介绍怎样通过分析GC日志来定位Java进程的内存问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、GC 日志基础配置1. 启用详细 GC 日志2. 不同收集器的日志格式二、关键指标与分析维度1.

Java 线程安全与 volatile与单例模式问题及解决方案

《Java线程安全与volatile与单例模式问题及解决方案》文章主要讲解线程安全问题的五个成因(调度随机、变量修改、非原子操作、内存可见性、指令重排序)及解决方案,强调使用volatile关键字... 目录什么是线程安全线程安全问题的产生与解决方案线程的调度是随机的多个线程对同一个变量进行修改线程的修改操

Redis出现中文乱码的问题及解决

《Redis出现中文乱码的问题及解决》:本文主要介绍Redis出现中文乱码的问题及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1. 问题的产生2China编程. 问题的解决redihttp://www.chinasem.cns数据进制问题的解决中文乱码问题解决总结

全面解析MySQL索引长度限制问题与解决方案

《全面解析MySQL索引长度限制问题与解决方案》MySQL对索引长度设限是为了保持高效的数据检索性能,这个限制不是MySQL的缺陷,而是数据库设计中的权衡结果,下面我们就来看看如何解决这一问题吧... 目录引言:为什么会有索引键长度问题?一、问题根源深度解析mysql索引长度限制原理实际场景示例二、五大解决

Springboot如何正确使用AOP问题

《Springboot如何正确使用AOP问题》:本文主要介绍Springboot如何正确使用AOP问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录​一、AOP概念二、切点表达式​execution表达式案例三、AOP通知四、springboot中使用AOP导出

Python中Tensorflow无法调用GPU问题的解决方法

《Python中Tensorflow无法调用GPU问题的解决方法》文章详解如何解决TensorFlow在Windows无法识别GPU的问题,需降级至2.10版本,安装匹配CUDA11.2和cuDNN... 当用以下代码查看GPU数量时,gpuspython返回的是一个空列表,说明tensorflow没有找到

解决未解析的依赖项:‘net.sf.json-lib:json-lib:jar:2.4‘问题

《解决未解析的依赖项:‘net.sf.json-lib:json-lib:jar:2.4‘问题》:本文主要介绍解决未解析的依赖项:‘net.sf.json-lib:json-lib:jar:2.4... 目录未解析的依赖项:‘net.sf.json-lib:json-lib:jar:2.4‘打开pom.XM

IDEA Maven提示:未解析的依赖项的问题及解决

《IDEAMaven提示:未解析的依赖项的问题及解决》:本文主要介绍IDEAMaven提示:未解析的依赖项的问题及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝... 目录IDEA Maven提示:未解析的依编程赖项例如总结IDEA Maven提示:未解析的依赖项例如

Redis分片集群、数据读写规则问题小结

《Redis分片集群、数据读写规则问题小结》本文介绍了Redis分片集群的原理,通过数据分片和哈希槽机制解决单机内存限制与写瓶颈问题,实现分布式存储和高并发处理,但存在通信开销大、维护复杂及对事务支持... 目录一、分片集群解android决的问题二、分片集群图解 分片集群特征如何解决的上述问题?(与哨兵模

SpringBoot+Redis防止接口重复提交问题

《SpringBoot+Redis防止接口重复提交问题》:本文主要介绍SpringBoot+Redis防止接口重复提交问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不... 目录前言实现思路代码示例测试总结前言在项目的使用使用过程中,经常会出现某些操作在短时间内频繁提交。例