网页链接 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. js分页功能实现

    实现一个js的分页并在弹出框中显示 1.分页插件使用:bootstarp-paginator.js,需要先引入bootstarp.js和jquery.js等: !function($){"u ...

  2. Java基础系列--static关键字

    原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/8477914.html 一.概述 static关键字是Java诸多关键字中较常使用的一个,从 ...

  3. Java经典编程题50道之四十九

    计算某字符串中子串出现的次数. public class Example49 {    public static void main(String[] args) {        String s ...

  4. Java经典编程题50道之二十八

    对10个数进行排序. public class Example28 {    public static void main(String[] args) {        int[] s = { 5 ...

  5. ng组件通讯的几种方式

    通过输入型绑定把数据从父组件传到子组件. 如<app-hero-child *ngFor="let hero of heroes"  [hero]="hero&qu ...

  6. 使用Netbeans内置的Git工具

    在 NetBeans IDE 中使用 Git 支持 NetBeans IDE 为 Git 版本控制客户端提供支持.通过利用 IDE 的 Git 支持,您可以从 IDE 内的项目中直接执行版本控制任务. ...

  7. 手把手教你在Ubuntu上分别安装Nginx、PHP和Mysql

    手把手教你在Ubuntu上分别安装Nginx.PHP和Mysql

  8. 在windows上安装nginx

    在windows上安装nginx   最近自己也尝试了一下在windows上安装nginx,其实非常的简单,这里算是备忘一下.   首先需要到nginx的官网上下载最新版的nginx:http://n ...

  9. Linux常用软件

    网络应用 即时聊天 pidgin 支持多协议,如msn, yahoo, icq, irc ... eva QQ 聊天客户端,KDE程序,推荐 Skype 网络电话,网络聊天,推荐 lumaqq Jav ...

  10. Android HotFix动态加载框架介绍

    HotFix(Deprecated) https://github.com/dodola/HotFix 请关注 RocooFix 我重新写了一个RocooFix框架,解决了Nuwa因为Gradle1. ...