博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
P4012 深海机器人问题 最小费用最大流
阅读量:5273 次
发布时间:2019-06-14

本文共 3448 字,大约阅读时间需要 11 分钟。

  

题目描述

深海资源考察探险队的潜艇将到达深海的海底进行科学考察。

潜艇内有多个深海机器人。潜艇到达深海海底后,深海机器人将离开潜艇向预定目标移动。

深海机器人在移动中还必须沿途采集海底生物标本。沿途生物标本由最先遇到它的深海机器人完成采集。

每条预定路径上的生物标本的价值是已知的,而且生物标本只能被采集一次。

本题限定深海机器人只能从其出发位置沿着向北或向东的方向移动,而且多个深海机器人可以在同一时间占据同一位置。

用一个 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 12 21 23 45 67 28 109 32 0 02 2 2
输出样例#1: 
42

说明

1\leq P,Q\leq151P,Q15

1\leq a\leq 41a4

1\leq b\leq 61b6

 

没啥好说的  和方格取数几乎差不多 

#include
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
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 . flow edge[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

你可能感兴趣的文章
剑指offer python版 调整数组顺序使奇数位于偶数前面
查看>>
内容提供者编写步骤
查看>>
汇编指令
查看>>
Leader of All Crushing Machines in the Future
查看>>
luogu 4211
查看>>
Sql Server 默认值
查看>>
JavaEE之反射
查看>>
【转】经验分享:大型高并发高负载网站的系统架构
查看>>
HDU 6060 RXD and dividing (求贡献)
查看>>
java中 immutable,future,nio
查看>>
VMware ESX常用命令
查看>>
golang三方包应该如何安装--在线和离线
查看>>
选择排序
查看>>
鼠标移入移出透明度变化效果
查看>>
我工作这十年-世界在变化
查看>>
log4j2 不使用配置文件,动态生成logger对象
查看>>
[IOI2014]holiday假期(分治+主席树)
查看>>
python的上下文管理(contextlib)(2)
查看>>
mysql安装
查看>>
运算符有感
查看>>