网页链接 https://www.luogu.org/problemnew/show/4012

做题背景

在不久的将来,人工智能发展使得人类大量失业,也使得现在的我们做[深海机器人问题]做得想死...

准备工作

确实是一个很难的题目呢,要是做不出来,你可以选择看一看另一道题

https://www.luogu.org/problemnew/show/2045

这叫方格取数加强版(虽然说实话这道题跟方格取数没有关系)

也是深海机器人的弱化版

其实方格取数加强版的思路跟深海机器人是一样的,只是实现上深海机器人更困难

所以看完我的思路之后建议你先去做方格取数再来做它

做法

跑最大流最大费用流

你只需要按题目所给的去连边(方格取数加强版给边给的很清楚,深海机器人有些模糊,不懂看下面)

但是题目给你的两点之间要连两种边

1.一条 流量为1 费用为 价值×(-1) (因为要求最大费用)

2.一条 流量为INF 费用为 0

第一种边显然是经过并采集标本,所以只能走一次

第二种显然是经过但标本被采完,所以可以无限走

最后,也是最简单的,就是把

s -> 起点 流量为人数 费用为0

终点->t 流量为人数,费用为0

这就不用解释了吧.

如果你看不懂题目(其实我一开始也没看懂)看这里

以下是原话

input1---接下来的 P+1 行,每行有 Q 个正整数,表示向东移动路径上生物标本的价值,行数据依从南到北方向排列。

input2---再接下来的 Q+1 行,每行有 P 个正整数,表示向北移动路径上生物标本的价值,行数据依从西到东方向排列。

结合洛谷上的图看我给你的坐标图

先分析input1,它是这么连边的

(0,0)->(1,0)->...(q,0)

(0,1)->(1,1)->...(q,1)

 。。。。。。。。。。。。。。。。。。。。。。

(0,p)->(1,p)->...(q,p)

你会发现所给的数据有p+1行 (0,0) => (0,p)

每行有q+1个点 (0,X) => (q,X)

所以每行有q条边(边数=点数-1)

所以是p+1行一行q个

~~input2同理可得~~

代码

#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <vector>
#include <queue>
#define rg register int
#define il inline
#define INF 2147483647
#define SZ 10000000
#define pos(x,y) (x+(y-1)*(X+1))
using namespace std;
int p,q,s,t,Ans=0;
il int gi()
{
int q=0,w=1;char c=getchar();
while(!isdigit(c)){if(c=='-')w=-1;c=getchar();}
while(isdigit(c))q=q*10+c-'0',c=getchar();
return w*q;
}
struct Edge{int to,nxt,w,c;}e[5001];
int Ehead[5001],pe[5001],Ecnt=2;
il void Eadd(int u,int v,int w,int c)
{
e[Ecnt]=(Edge){v,Ehead[u],w,c};
Ehead[u]=Ecnt++;
e[Ecnt]=(Edge){u,Ehead[v],0,-c};
Ehead[v]=Ecnt++;
}
int dis[5001];
bool vis[5001];
queue <int> Q;
il bool spfa()
{
for(rg i=1;i<=t;++i) dis[i]=INF;
dis[s]=0;Q.push(s);
while(!Q.empty())
{
rg u=Q.front();Q.pop();
for(rg i=Ehead[u];i;i=e[i].nxt)
{
rg v=e[i].to;
if((e[i].w&&dis[v]>dis[u]+e[i].c))
{
dis[v]=dis[u]+e[i].c;
pe[v]=i;
if(!vis[v]) vis[v]=1,Q.push(v);
}
}
vis[u]=0;
}
if(dis[t]==INF) return 0; int di=INF;
for(rg i=t;i^s;i=e[pe[i]^1].to)
di=min(di,e[pe[i]].w);
Ans-=di*dis[t];
for(rg i=t;i^s;i=e[pe[i]^1].to)
e[pe[i]].w-=di,e[pe[i]^1].w+=di;
return 1;
}
int A,B,k,x,y,X,Y,a;
int main()
{
cin>>A>>B>>Y>>X;
s=0;t=(X+1)*(Y+1)+1;
for(rg i=1;i<=Y+1;++i)
for(rg j=1;j<=X;++j)
{
a=gi();
Eadd(pos(j,i),pos(j+1,i),1,-a);
Eadd(pos(j,i),pos(j+1,i),INF,0);
}
for(rg i=1;i<=X+1;++i)
for(rg j=1;j<=Y;++j)
{
a=gi();
Eadd(pos(i,j),pos(i,j+1),1,-a);
Eadd(pos(i,j),pos(i,j+1),INF,0);
}
for(rg i=1;i<=A;++i)
{
k=gi(),x=gi(),y=gi();
Eadd(s,pos(y+1,x+1),k,0);
}
for(rg i=1;i<=B;++i)
{
k=gi(),x=gi(),y=gi();
Eadd(pos(y+1,x+1),t,k,0);
}
while(spfa());
cout<<Ans;
return 0;
}

(luogu P4012)深海机器人问题 [TPLY]的更多相关文章

  1. luogu P4012 深海机器人问题

    luogu P4012 深海机器人问题 // luogu-judger-enable-o2 #include<queue> #include<cstdio> #include& ...

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

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

  3. P4012 深海机器人问题

    \(\color{#0066ff}{题目描述}\) 深海资源考察探险队的潜艇将到达深海的海底进行科学考察. 潜艇内有多个深海机器人.潜艇到达深海海底后,深海机器人将离开潜艇向预定目标移动. 深海机器人 ...

  4. 洛谷P4012 深海机器人问题(费用流)

    题目描述 深海资源考察探险队的潜艇将到达深海的海底进行科学考察. 潜艇内有多个深海机器人.潜艇到达深海海底后,深海机器人将离开潜艇向预定目标移动. 深海机器人在移动中还必须沿途采集海底生物标本.沿途生 ...

  5. 洛谷P4012 深海机器人问题(费用流)

    传送门 图给的好坑……还得倒过来…… 用大佬的图做个示范 我们考虑左图吧 把每一个点向下连边,容量$1$,费用为给出的价值(表示一个机器人可以过去取得标本) 再连一条边,容量$inf$,费用$0$(表 ...

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

    和火星那个有点像,但是这个价值直接在路径上,不用拆点,对于每条价值为w的边(i,j),连接(i,j,1,w)(i,j,inf,0),表示价值只能取一次,然后连接源点和所有出发点(s,i,k,0),所有 ...

  7. [洛谷P4012] [网络流24题] 深海机器人问题

    Description 深海资源考察探险队的潜艇将到达深海的海底进行科学考察. 潜艇内有多个深海机器人.潜艇到达深海海底后,深海机器人将离开潜艇向预定目标移动. 深海机器人在移动中还必须沿途采集海底生 ...

  8. 【网络流24题】No. 20 深海机器人问题 (费用流)

    [题意] 深海资源考察探险队的潜艇将到达深海的海底进行科学考察.潜艇内有多个深海机器人. 潜艇到达深海海底后, 深海机器人将离开潜艇向预定目标移动. 深海机器人在移动中还必须沿途采集海底生物标本. 沿 ...

  9. 【刷题】LOJ 6224 「网络流 24 题」深海机器人问题

    题目描述 深海资源考察探险队的潜艇将到达深海的海底进行科学考察. 潜艇内有多个深海机器人.潜艇到达深海海底后,深海机器人将离开潜艇向预定目标移动. 深海机器人在移动中还必须沿途采集海底生物标本.沿途生 ...

随机推荐

  1. Python数据结构之一——list(列表)

    Python版本:3.6.2  操作系统:Windows   作者:SmallWZQ Python包含6种常见的内建序列.它们分别是列表.元祖.字符串.Unicode字符串.buffer(memory ...

  2. pygame写贪吃蛇

    python小白尝试写游戏.. 学了点pygame不知道那什么练手好,先拿贪吃蛇开刀吧. 一个游戏可以粗略的分为两个部分: 数据(变量) 处理数据(函数,方法) 设计变量 首先预想下,画面的那些部分需 ...

  3. Math Jax开源数学编辑器的使用

    首先,这是一个开源免费,同时也可以支持扩展的软件. 使用API文档: 中文网站(http://mathjax-chinese-doc.readthedocs.io/en/latest/index.ht ...

  4. Go生成easyjson文件

    [生成easyjson文件] cd services/api_adapter/aliafp   #先删除已有的aliafp_easyjson.go文件,并且把除了aliafp.go以外的其他文件移动到 ...

  5. Python网络编程(1)-socket

    我会在近期尽快更新好之前写的博客,会添加新的知识点和注意问题,排版和内容都会较之前有很大的改观,感谢大家一直的支持! 1. 客户端/服务器架构 客户端/服务器架构也称主从式架构,简称C/S架构,它是一 ...

  6. 《android开发进阶从小工到专家》读书笔记--HTTP网络请求

    No1: 客户端与服务器的交互流程: 1)客户端执行网络请求,从URL中解析出服务器的主机名 2)将服务器的主机名转换成服务器的IP地址 3)将端口号从URL中解析出来 4)建立一条从客户端与Web服 ...

  7. CodeForces - 796A Buying A House

    思路:从m直接向两边枚举,如果当前点需要的费用小于等于k,说明一定是最近距离. AC代码 #include <cstdio> #include <cmath> #include ...

  8. 长整形的使用及cin加速

    _int64 和 long long 那么对ACMer来说,最为关心的就是在各个OJ上交题应分别使用哪种方式了.其实方式只有有限的几种: 如果服务器是linux系统,那么定义用long long,IO ...

  9. hadoop配置遇到问题的解决

    1. ssh localhost: 不能登陆:将错误提示中的文件全部删除.原因:登陆过远程主机 2. 问题: 伪分布式datanode启动不了:在datanode的log日志文件出现以下错误提示:   ...

  10. java读取文件乱码

    List<String> lines=new ArrayList<String>(); BufferedReader br = new BufferedReader(new F ...