[洛谷P4012] [网络流24题] 深海机器人问题
Description###
深海资源考察探险队的潜艇将到达深海的海底进行科学考察。
潜艇内有多个深海机器人。潜艇到达深海海底后,深海机器人将离开潜艇向预定目标移动。
深海机器人在移动中还必须沿途采集海底生物标本。沿途生物标本由最先遇到它的深海机器人完成采集。
每条预定路径上的生物标本的价值是已知的,而且生物标本只能被采集一次。
本题限定深海机器人只能从其出发位置沿着向北或向东的方向移动,而且多个深海机器人可以在同一时间占据同一位置。
用一个 P×Q 网格表示深海机器人的可移动位置。西南角的坐标为(0,0) ,东北角的坐标为(Q,P) 。

给定每个深海机器人的出发位置和目标位置,以及每条网格边上生物标本的价值。
计算深海机器人的最优移动方案, 使深海机器人到达目的地后,采集到的生物标本的总价值最高。
Input###
文件的第 11 行为深海机器人的出发位置数 a ,和目的地数 b 。
第 22 行为 P 和 Q 的值。
接下来的 P+1 行,每行有 Q 个正整数,表示向东移动路径上生物标本的价值,行数据依从南到北方向排列。
再接下来的 Q+1 行,每行有 P 个正整数,表示向北移动路径上生物标本的价值,行数据依从西到东方向排列。
接下来的 a 行,每行有 3 个正整数 k,x,y ,表示有 k 个深海机器人从 (x,y) 位置坐标出发。
再接下来的 b 行,每行有 3 个正整数 r,x,y ,表示有 r 个深海机器人可选择 (x,y) 位置坐标作为目的地。
a行和b行输入时横纵坐标要反过来
Output###
输出采集到的生物标本的最高总价值.
Sample Input###
1 1
2 2
1 2
3 4
5 6
7 2
8 10
9 3
2 0 0
2 2 2
Sample Output###
42
HINT###
1≤P,Q≤15
1≤a≤4
1≤b≤6
想法##
还是挺容易的一道题
直接按题目所说的建图,每相邻两个点间连两条边
一条容量为1,代价为-val
另一条容量为INF,代价为0
跑一遍最小费用最大流,答案\(\times\)-1就行了
代码##
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<queue>
#define INF 2000000000
using namespace std;
typedef long long ll;
const int N = 17;
const int M = N*N;
struct node{
int v,f,c;
node *next,*rev;
}pool[M*8+20],*h[M],*pree[M];
int cnt;
void addedge(int u,int v,int f,int c){
node *p=&pool[++cnt],*q=&pool[++cnt];
p->v=v;p->next=h[u];h[u]=p; p->f=f;p->c=c;p->rev=q;
q->v=u;q->next=h[v];h[v]=q; q->f=0;q->c=-c;q->rev=p;
}
int S,T;
ll d[M];
int vis[M],pre[M];
queue<int> que;
bool spfa(){
int u,v;
while(!que.empty()) que.pop();
for(int i=S;i<=T;i++) d[i]=INF;
d[S]=0; vis[S]=1;
que.push(S);
while(!que.empty()){
u=que.front(); que.pop();
vis[u]=0;
for(node *p=h[u];p;p=p->next)
if(p->f && d[v=p->v]>d[u]+p->c){
d[v]=d[u]+p->c;
pre[v]=u;
pree[v]=p;
if(!vis[v]) { que.push(v); vis[v]=1; }
}
}
return d[T]!=INF;
}
void cal(ll &f,ll &c){
int u=T,w=INF;
node *p=pree[u];
while(u!=S){
w=min(w,p->f);
u=pre[u]; p=pree[u];
}
f+=w; c+=w*d[T];
u=T; p=pree[u];
while(u!=S){
p->f-=w;
p->rev->f+=w;
u=pre[u]; p=pree[u];
}
}
ll MCMF(){
ll f=0,c=0;
while(spfa()) cal(f,c);
return c;
}
int a,b,n,m;
int main()
{
scanf("%d%d%d%d",&a,&b,&n,&m);
n++;m++;
S=0; T=n*m+1;
int x,y,k;
for(int i=1;i<=n;i++)
for(int j=1;j<m;j++) {
scanf("%d",&x);
addedge((i-1)*m+j,(i-1)*m+j+1,1,-x);
addedge((i-1)*m+j,(i-1)*m+j+1,INF,0);
}
for(int j=1;j<=m;j++)
for(int i=1;i<n;i++) {
scanf("%d",&x);
addedge((i-1)*m+j,i*m+j,1,-x);
addedge((i-1)*m+j,i*m+j,INF,0);
}
for(int i=0;i<a;i++){
scanf("%d%d%d",&k,&x,&y);
x++;y++;
addedge(S,(x-1)*m+y,k,0);
}
for(int i=0;i<b;i++){
scanf("%d%d%d",&k,&x,&y);
x++;y++;
addedge((x-1)*m+y,T,k,0);
}
printf("%lld\n",-MCMF());
return 0;
}
[洛谷P4012] [网络流24题] 深海机器人问题的更多相关文章
- [洛谷P3254] [网络流24题] 圆桌游戏
Description 假设有来自m 个不同单位的代表参加一次国际会议.每个单位的代表数分别为ri (i =1,2,--,m). 会议餐厅共有n 张餐桌,每张餐桌可容纳ci (i =1,2,--,n) ...
- 洛谷 P4012 深海机器人问题【费用流】
题目链接:https://www.luogu.org/problemnew/show/P4012 洛谷 P4012 深海机器人问题 输入输出样例 输入样例#1: 1 1 2 2 1 2 3 4 5 6 ...
- 洛谷P4009汽车加油行驶问题——网络流24题(最短路)
题目:https://www.luogu.org/problemnew/show/P4009 网络流24题中不是网络流的最短路题: 把每个点拆成各个油量上的点,根据要求连边即可: 注意:点数最大为10 ...
- [网络流24题] 洛谷P2761 软件补丁问题
题意:某公司发现其研制的一个软件中有 n个错误,随即为该软件发放了一批共 m 个补丁程序.对于每一个补丁 i ,都有 2 个与之相应的错误集合 B1(i)和 B2(i),使得仅当软件包含 B1(i)中 ...
- 网络流24题 gay题报告
洛谷上面有一整套题. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 extra ①飞行员配对方案问题.top 裸二分图匹 ...
- 【线性规划与网络流 24题】已完成(3道题因为某些奇怪的原因被抛弃了QAQ)
写在前面:SDOI2016 Round1滚粗后蒟蒻开始做网络流来自我拯救(2016-04-11再过几天就要考先修课,现在做网络流24题貌似没什么用←退役节奏) 做的题目将附上日期,见证我龟速刷题. 1 ...
- 【网络流24题】最长k可重线段集(费用流)
[网络流24题]最长k可重线段集(费用流) 题面 Cogs的数据有问题 Loj 洛谷 题解 这道题和最长k可重区间集没有区别 只不过费用额外计算一下 但是,还是有一点要注意的地方 这里可以是一条垂直的 ...
- 【网络流24题】最长k可重区间集(费用流)
[网络流24题]最长k可重区间集(费用流) 题面 Cogs Loj 洛谷 题解 首先注意一下 这道题目里面 在Cogs上直接做就行了 洛谷和Loj上需要判断数据合法,如果\(l>r\)就要交换\ ...
- 【算法】【网络流24题】巨坑待填(成功TJ,有时间再填)
------------------------------------------------------------------------------------ 17/24 --------- ...
随机推荐
- Linux 内核驱动支持什么设备
struct usb_device_id 结构提供了这个驱动支持的一个不同类型 USB 设备的列表. 这个 列表被 USB 核心用来决定给设备哪个驱动, 并且通过热插拔脚本来决定哪个驱动自动加载, 当 ...
- C# dotnet 获取整个局域网的 ip 地址
局域网可以使用的 IP 地址有很多,我写了一段代码用来枚举所有可以用的 ip 地址 小伙伴都知道,局域网可以使用的 IP 范围如下 A类地址:10.0.0.0 - 10.255.255.255 B类地 ...
- CentOS遇到Qt编译问题(error: cannot find -lGL)
1.安装Qt,进入CentOS系统的终端,依次执行以下命令 chmod +x qt-opensource-Linux-x64-5.5.1.run ./qt-opensource-linux-x64-5 ...
- 拒绝FileNotFoundException!总结了这几个读取jar包外配置文件的知识点
前言 相信很多人遇到过这个问题:本地运行的好好的程序,怎么部署到线上就报找不到配置呢? 初识getResource 案例一 FieldMapConfig.class.getResource(" ...
- com.mysql.jdbc.PacketTooBigException: Packet for query is too large (1680 > 1024). You can change this value on the server by setting the max_allowed_packet' variable.
这个错误是由于mysql的一个系统参数max_allowed_packet设置的值过小引起的 解决这个错误的方法就是修改这个参数的值, linux系统中我们在etc目录下找到my.cnf这个文件,打开 ...
- hdu3499---玄学的分层图
枚举固然可以,但是我还是想看看分层图.... 如本题所述 ,从上图到下图就是一个折扣的过程,上部分只有一种办法下去,下部分图没有办法去上面,该模型十分的巧妙啊!!! 下面我来演示一下自己改的样例吧 紫 ...
- 使用vue-quill-editor富文本 实现图片上传
1. 下载并引入 import { quillEditor, Quill } from "vue-quill-editor"; import { container, ImageE ...
- Python 元类的基本介绍及使用
一.什么是元类 二.如何使用元类 (一)不依赖class关键字创建一个自定义类 (二)自定义元类控制类的产生 (三)自定义元类控制类的调用 一.什么是元类 在python中,一切皆对象,而对象都是由类 ...
- awsl
from enum import Enum, uniquefrom math import sqrtfrom random import randint import pygame @uniquecl ...
- 机器学习之路--seaborn
seaborn是基于plt的封装好的库.有很强的作图功能. 1.布局风格设置(图形的style)and 细节设置 用matplotlib作图: import numpy as np import ma ...