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题] 深海机器人问题的更多相关文章

  1. [洛谷P3254] [网络流24题] 圆桌游戏

    Description 假设有来自m 个不同单位的代表参加一次国际会议.每个单位的代表数分别为ri (i =1,2,--,m). 会议餐厅共有n 张餐桌,每张餐桌可容纳ci (i =1,2,--,n) ...

  2. 洛谷 P4012 深海机器人问题【费用流】

    题目链接:https://www.luogu.org/problemnew/show/P4012 洛谷 P4012 深海机器人问题 输入输出样例 输入样例#1: 1 1 2 2 1 2 3 4 5 6 ...

  3. 洛谷P4009汽车加油行驶问题——网络流24题(最短路)

    题目:https://www.luogu.org/problemnew/show/P4009 网络流24题中不是网络流的最短路题: 把每个点拆成各个油量上的点,根据要求连边即可: 注意:点数最大为10 ...

  4. [网络流24题] 洛谷P2761 软件补丁问题

    题意:某公司发现其研制的一个软件中有 n个错误,随即为该软件发放了一批共 m 个补丁程序.对于每一个补丁 i ,都有 2 个与之相应的错误集合 B1(i)和 B2(i),使得仅当软件包含 B1(i)中 ...

  5. 网络流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 裸二分图匹 ...

  6. 【线性规划与网络流 24题】已完成(3道题因为某些奇怪的原因被抛弃了QAQ)

    写在前面:SDOI2016 Round1滚粗后蒟蒻开始做网络流来自我拯救(2016-04-11再过几天就要考先修课,现在做网络流24题貌似没什么用←退役节奏) 做的题目将附上日期,见证我龟速刷题. 1 ...

  7. 【网络流24题】最长k可重线段集(费用流)

    [网络流24题]最长k可重线段集(费用流) 题面 Cogs的数据有问题 Loj 洛谷 题解 这道题和最长k可重区间集没有区别 只不过费用额外计算一下 但是,还是有一点要注意的地方 这里可以是一条垂直的 ...

  8. 【网络流24题】最长k可重区间集(费用流)

    [网络流24题]最长k可重区间集(费用流) 题面 Cogs Loj 洛谷 题解 首先注意一下 这道题目里面 在Cogs上直接做就行了 洛谷和Loj上需要判断数据合法,如果\(l>r\)就要交换\ ...

  9. 【算法】【网络流24题】巨坑待填(成功TJ,有时间再填)

    ------------------------------------------------------------------------------------ 17/24 --------- ...

随机推荐

  1. vue 数据监听原理

    Vue.prototype.listenDatas = function(){ for(var attr in this.$data){ this.listenData(this,attr,this. ...

  2. linux大盘格式化分区

    Linux 实例的磁盘管理 对于 Linux 系统上的大磁盘,也要采用 GPT 分区格式, 也可以不分区, 把磁盘当成一个整体设备使用. 在 Linux 上一般采用 XFS 或者 EXT4 来做大盘的 ...

  3. 洛谷$P4177\ [CEOI2008]\ order$ 网络流

    正解:网络流 解题报告: 传送门$QwQ$ 开始看感$jio$长得好像和太空飞行计划差不多的,,,然后仔细康康发现还有租操作,,, 按一般的套路碰到这样儿的一般就先按非特殊化的建图然后考虑怎么实现这个 ...

  4. Codeforces Round #524 (Div. 2)(前三题题解)

    这场比赛手速场+数学场,像我这样读题都读不大懂的蒟蒻表示呵呵呵. 第四题搞了半天,大概想出来了,但来不及(中途家里网炸了)查错,于是我交了两次丢了100分.幸亏这次没有掉rating. 比赛传送门:h ...

  5. 1053 住房空置率 (20 分)C语言

    在不打扰居民的前提下,统计住房空置率的一种方法是根据每户用电量的连续变化规律进行判断.判断方法如下: 在观察期内,若存在超过一半的日子用电量低于某给定的阈值 e,则该住房为"可能空置&quo ...

  6. keuectl命令

    Kubernetes命令行 kubectl用于运行Kubernetes集群命令的管理工具 kubectl命令行语法 kubectl [command] [TYPE] [NAME] [flags] co ...

  7. Spring boot项目搭建及简单实例

    Spring boot项目搭建 Spring Boot 概述 Build Anything with Spring Boot:Spring Boot is the starting point for ...

  8. ACM北大暑期课培训第八天

    今天学了有流量下界的网络最大流,最小费用最大流,计算几何. 有流量下界的网络最大流 如果流网络中每条边e对应两个数字B(e)和C(e), 分别表示该边上的流量至少要是B(e),最多 C(e),那么,在 ...

  9. c++ beep 演奏一次质量不高的天空之城

    beep函数用法: beep(HZ,time); hz是发出多少赫兹声音,time是发声时间(ms) 话不多说,上代码 #include <cstdio> #include <win ...

  10. 【JavaScript学习笔记】函数、数组、日期

    一.函数 一个函数应该只返回一种类型的值. 函数中有一个默认的数组变量arguments,存储着传入函数的所有参数. 为了使用函数参数方便,建议给参数起个名字. function fun1(obj, ...