深海机器人(cogs 742)
«问题描述:
深海资源考察探险队的潜艇将到达深海的海底进行科学考察。潜艇内有多个深海机器
人。潜艇到达深海海底后,深海机器人将离开潜艇向预定目标移动。深海机器人在移动中还
必须沿途采集海底生物标本。沿途生物标本由最先遇到它的深海机器人完成采集。每条预定
路径上的生物标本的价值是已知的,而且生物标本只能被采集一次。本题限定深海机器人只
能从其出发位置沿着向北或向东的方向移动,而且多个深海机器人可以在同一时间占据同一
位置。
«编程任务:
用一个P´Q 网格表示深海机器人的可移动位置。西南角的坐标为(0,0),东北角的坐
标为 (Q,P)。
给定每个深海机器人的出发位置和目标位置,以及每条网格边上生物标本的价值。计算
深海机器人的最优移动方案,使深海机器人到达目的地后,采集到的生物标本的总价值最高。
«数据输入:
由文件shinkai.in提供输入数据。文件的第1 行为深海机器人的出发位置数a,和目的地
数b,第2 行为P和Q 的值。接下来的P+1 行,每行有Q 个正整数,表示向东移动路径上
生物标本的价值,行数据依从南到北方向排列。再接下来的Q+1 行,每行有P 个正整数,
表示向北移动路径上生物标本的价值,行数据依从西到东方向排列。接下来的a行,每行有
3 个正整数k,x,y,表示有k个深海机器人从(x,y)位置坐标出发。再接下来的b行,每行有3
个正整数r,x,y,表示有r个深海机器人可选择(x,y)位置坐标作为目的地。
«结果输出:
程序运行结束时,将采集到的生物标本的最高总价值输出到文件shinkai.out中。
shinkai.in
1 1
2 2
1 2
3 4
5 6
7 2
8 10
9 3
2 0 0
2 2 2
shinkai.out
42
1<=P,Q<=15 1<=a,b<=10
/*
费用流。
因为每条边可以随便走,并且只能获利一次,所以把每条边拆成两条边,
一条容量为1,费用为w,另一条容量无限,费用为0。
注意体面中的x,y坐标比较坑。
*/
#include<iostream>
#include<cstdio>
#include<queue>
#define N 1010
#define inf 1000000000
using namespace std;
int head[N],dis[N],inq[N],fa[N],a,b,P,Q,S,T,cnt=;
struct node{int v,f,w,pre;}e[N*];
queue<int> q;
void add(int u,int v,int f,int w){
e[++cnt].v=v;e[cnt].f=f;e[cnt].w=w;e[cnt].pre=head[u];head[u]=cnt;
e[++cnt].v=u;e[cnt].f=;e[cnt].w=-w;e[cnt].pre=head[v];head[v]=cnt;
}
bool spfa(){
for(int i=;i<=T;i++) dis[i]=inf;
dis[S]=;q.push(S);
while(!q.empty()){
int u=q.front();q.pop();inq[u]=;
for(int i=head[u];i;i=e[i].pre)
if(e[i].f&&dis[e[i].v]>dis[u]+e[i].w){
dis[e[i].v]=dis[u]+e[i].w;
fa[e[i].v]=i;
if(!inq[e[i].v]){
inq[e[i].v]=;
q.push(e[i].v);
}
}
}
return dis[T]!=inf;
}
int updata(){
int i=fa[T],x=inf;
while(i){
x=min(x,e[i].f);
i=fa[e[i^].v];
}
i=fa[T];
while(i){
e[i].f-=x;
e[i^].f+=x;
i=fa[e[i^].v];
}
return x*dis[T];
}
int id(int x,int y){return (x-)*Q+y;}
int main(){
freopen("shinkai.in","r",stdin);
freopen("shinkai.out","w",stdout);
scanf("%d%d%d%d",&a,&b,&P,&Q);P++;Q++;
S=;T=P*Q+;
for(int i=;i<=P;i++)
for(int j=;j<Q;j++){
int x;scanf("%d",&x);
add(id(i,j),id(i,j+),,-x);
add(id(i,j),id(i,j+),inf,);
}
for(int j=;j<=Q;j++)
for(int i=;i<P;i++){
int x;scanf("%d",&x);
add(id(i,j),id(i+,j),,-x);
add(id(i,j),id(i+,j),inf,); }
for(int i=;i<=a;i++){
int k,x,y;scanf("%d%d%d",&k,&x,&y);
add(S,id(x+,y+),k,);
}
for(int i=;i<=b;i++){
int k,x,y;scanf("%d%d%d",&k,&x,&y);
add(id(x+,y+),T,k,);
}
int minv=;
while(spfa())
minv+=updata();
printf("%d",-minv);
return ;
}
深海机器人(cogs 742)的更多相关文章
- 【网络流24题】No. 20 深海机器人问题 (费用流)
[题意] 深海资源考察探险队的潜艇将到达深海的海底进行科学考察.潜艇内有多个深海机器人. 潜艇到达深海海底后, 深海机器人将离开潜艇向预定目标移动. 深海机器人在移动中还必须沿途采集海底生物标本. 沿 ...
- (luogu P4012)深海机器人问题 [TPLY]
网页链接 https://www.luogu.org/problemnew/show/4012 做题背景 在不久的将来,人工智能发展使得人类大量失业,也使得现在的我们做[深海机器人问题]做得想死... ...
- 【刷题】LOJ 6224 「网络流 24 题」深海机器人问题
题目描述 深海资源考察探险队的潜艇将到达深海的海底进行科学考察. 潜艇内有多个深海机器人.潜艇到达深海海底后,深海机器人将离开潜艇向预定目标移动. 深海机器人在移动中还必须沿途采集海底生物标本.沿途生 ...
- 洛谷 P4012 深海机器人问题【费用流】
题目链接:https://www.luogu.org/problemnew/show/P4012 洛谷 P4012 深海机器人问题 输入输出样例 输入样例#1: 1 1 2 2 1 2 3 4 5 6 ...
- luogu P4012 深海机器人问题
luogu P4012 深海机器人问题 // luogu-judger-enable-o2 #include<queue> #include<cstdio> #include& ...
- P4012 深海机器人问题
\(\color{#0066ff}{题目描述}\) 深海资源考察探险队的潜艇将到达深海的海底进行科学考察. 潜艇内有多个深海机器人.潜艇到达深海海底后,深海机器人将离开潜艇向预定目标移动. 深海机器人 ...
- [CODEVS1917] 深海机器人问题(最小费用最大流)
传送门 [问题分析] 最大费用最大流问题. [建模方法] 把网格中每个位置抽象成网络中一个节点,建立附加源S汇T. 1.对于每个顶点i,j为i东边或南边相邻的一个节点,连接节点i与节点j一条容量为1, ...
- 洛谷P4012 深海机器人问题(费用流)
题目描述 深海资源考察探险队的潜艇将到达深海的海底进行科学考察. 潜艇内有多个深海机器人.潜艇到达深海海底后,深海机器人将离开潜艇向预定目标移动. 深海机器人在移动中还必须沿途采集海底生物标本.沿途生 ...
- LuoguP4012 深海机器人问题(费用流)
题目描述 深海资源考察探险队的潜艇将到达深海的海底进行科学考察. 潜艇内有多个深海机器人.潜艇到达深海海底后,深海机器人将离开潜艇向预定目标移动. 深海机器人在移动中还必须沿途采集海底生物标本.沿途生 ...
随机推荐
- Qt之QThread随记
这是一篇随记,排版什么的就没有那么好了:) 首先要知道,一个线程在资源分配完之后是以某段代码为起点开始执行的,例如STL内的std::thread,POSIX下的pthread等,都是以函数加其参数之 ...
- mysql 5.7安装步骤:
.下载完成后解压: 3.在mysql要目录下创建 my.ini 文件,如上图,文件内容如下,basedir 和 datadir 修改为相应地址: [mysql] # 设置mysql客户端默认字符集 d ...
- 二十八、MySQL 元数据
MySQL 元数据 你可能想知道MySQL以下三种信息: 查询结果信息: SELECT, UPDATE 或 DELETE语句影响的记录数. 数据库和数据表的信息: 包含了数据库及数据表的结构信息. M ...
- Ubuntu12.04下YouCompleteMe安装教程(部分)
1.通过源码编译安装VIM 开发中使用的是Ubuntu 12.04 LTS,通过sudo apt-get install vim安装的版本较低,不支持YCM,所以,用源码编译并安装最新的Vim. 卸载 ...
- Vue之简易的留言板功能
今天我将带大家通过Vue的todolist案例来完成一个简易的网页留言板! LES'T GO! 首先我们需要在页面上搭建一个input文本输入框,并设置提交按钮,通过循环指令来完成输入框的信息提交! ...
- Android开发——常见的内存泄漏以及解决方案(二)
)Android2.3以后,SoftReference不再可靠.垃圾回收期更容易回收它,不再是内存不足时才回收软引用.那么缓存机制便失去了意义.Google官方建议使用LruCache作为缓存的集合类 ...
- Apache的安装与下载
PHP的运行必然少不了服务器的支持,何为服务器?通俗讲就是在一台计算机上,安装个服务器软件,这台计算机便可以称之为服务器,服务器软件和计算机本身的操作系统是两码事,计算机自身的操作系统可以为linux ...
- TCP/IP网络编程之网络编程和套接字
网络编程和套接字 网络编程又称为套接字编程,就是编写一段程序,使得两台连网的计算机彼此之间可以交换数据.那么,这两台计算机用什么传输数据呢?首先,需要物理连接,将一台台独立的计算机通过物理线路连接在一 ...
- pycharm中某些方法被标黄的原因及解决办法
在编辑python文件时,会遇到上图所示,函数方法被标黄的问题,但是不影响使用. 引起原因:,如果不报错说明,这是因为你配置的python解释器中有该方法,但是pycharm没有找到这个方法,即加载失 ...
- 关于mybatis 一级缓存引发的问题
场景: 由于在一个方法中存在多个不同业务操作 private void insertOrUpdateField(CompanyReport entity) { //计算并数据 calcReportDa ...