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

相关文章

解决Maven项目idea找不到本地仓库jar包问题以及使用mvn install:install-file

《解决Maven项目idea找不到本地仓库jar包问题以及使用mvninstall:install-file》:本文主要介绍解决Maven项目idea找不到本地仓库jar包问题以及使用mvnin... 目录Maven项目idea找不到本地仓库jar包以及使用mvn install:install-file基

usb接口驱动异常问题常用解决方案

《usb接口驱动异常问题常用解决方案》当遇到USB接口驱动异常时,可以通过多种方法来解决,其中主要就包括重装USB控制器、禁用USB选择性暂停设置、更新或安装新的主板驱动等... usb接口驱动异常怎么办,USB接口驱动异常是常见问题,通常由驱动损坏、系统更新冲突、硬件故障或电源管理设置导致。以下是常用解决

Mysql如何解决死锁问题

《Mysql如何解决死锁问题》:本文主要介绍Mysql如何解决死锁问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录【一】mysql中锁分类和加锁情况【1】按锁的粒度分类全局锁表级锁行级锁【2】按锁的模式分类【二】加锁方式的影响因素【三】Mysql的死锁情况【1

SpringBoot内嵌Tomcat临时目录问题及解决

《SpringBoot内嵌Tomcat临时目录问题及解决》:本文主要介绍SpringBoot内嵌Tomcat临时目录问题及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录SprinjavascriptgBoot内嵌Tomcat临时目录问题1.背景2.方案3.代码中配置t

SpringBoot使用GZIP压缩反回数据问题

《SpringBoot使用GZIP压缩反回数据问题》:本文主要介绍SpringBoot使用GZIP压缩反回数据问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录SpringBoot使用GZIP压缩反回数据1、初识gzip2、gzip是什么,可以干什么?3、Spr

如何解决idea的Module:‘:app‘platform‘android-32‘not found.问题

《如何解决idea的Module:‘:app‘platform‘android-32‘notfound.问题》:本文主要介绍如何解决idea的Module:‘:app‘platform‘andr... 目录idea的Module:‘:app‘pwww.chinasem.cnlatform‘android-32

kali linux 无法登录root的问题及解决方法

《kalilinux无法登录root的问题及解决方法》:本文主要介绍kalilinux无法登录root的问题及解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,... 目录kali linux 无法登录root1、问题描述1.1、本地登录root1.2、ssh远程登录root2、

SpringBoot应用中出现的Full GC问题的场景与解决

《SpringBoot应用中出现的FullGC问题的场景与解决》这篇文章主要为大家详细介绍了SpringBoot应用中出现的FullGC问题的场景与解决方法,文中的示例代码讲解详细,感兴趣的小伙伴可... 目录Full GC的原理与触发条件原理触发条件对Spring Boot应用的影响示例代码优化建议结论F

MySQL 中查询 VARCHAR 类型 JSON 数据的问题记录

《MySQL中查询VARCHAR类型JSON数据的问题记录》在数据库设计中,有时我们会将JSON数据存储在VARCHAR或TEXT类型字段中,本文将详细介绍如何在MySQL中有效查询存储为V... 目录一、问题背景二、mysql jsON 函数2.1 常用 JSON 函数三、查询示例3.1 基本查询3.2

Pyserial设置缓冲区大小失败的问题解决

《Pyserial设置缓冲区大小失败的问题解决》本文主要介绍了Pyserial设置缓冲区大小失败的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录问题描述原因分析解决方案问题描述使用set_buffer_size()设置缓冲区大小后,buf