(luogu P4012)深海机器人问题 [TPLY]
网页链接 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]的更多相关文章
- luogu P4012 深海机器人问题
luogu P4012 深海机器人问题 // luogu-judger-enable-o2 #include<queue> #include<cstdio> #include& ...
- 洛谷 P4012 深海机器人问题【费用流】
题目链接:https://www.luogu.org/problemnew/show/P4012 洛谷 P4012 深海机器人问题 输入输出样例 输入样例#1: 1 1 2 2 1 2 3 4 5 6 ...
- P4012 深海机器人问题
\(\color{#0066ff}{题目描述}\) 深海资源考察探险队的潜艇将到达深海的海底进行科学考察. 潜艇内有多个深海机器人.潜艇到达深海海底后,深海机器人将离开潜艇向预定目标移动. 深海机器人 ...
- 洛谷P4012 深海机器人问题(费用流)
题目描述 深海资源考察探险队的潜艇将到达深海的海底进行科学考察. 潜艇内有多个深海机器人.潜艇到达深海海底后,深海机器人将离开潜艇向预定目标移动. 深海机器人在移动中还必须沿途采集海底生物标本.沿途生 ...
- 洛谷P4012 深海机器人问题(费用流)
传送门 图给的好坑……还得倒过来…… 用大佬的图做个示范 我们考虑左图吧 把每一个点向下连边,容量$1$,费用为给出的价值(表示一个机器人可以过去取得标本) 再连一条边,容量$inf$,费用$0$(表 ...
- 洛谷 P4012 深海机器人问题 【最大费用最大流】
和火星那个有点像,但是这个价值直接在路径上,不用拆点,对于每条价值为w的边(i,j),连接(i,j,1,w)(i,j,inf,0),表示价值只能取一次,然后连接源点和所有出发点(s,i,k,0),所有 ...
- [洛谷P4012] [网络流24题] 深海机器人问题
Description 深海资源考察探险队的潜艇将到达深海的海底进行科学考察. 潜艇内有多个深海机器人.潜艇到达深海海底后,深海机器人将离开潜艇向预定目标移动. 深海机器人在移动中还必须沿途采集海底生 ...
- 【网络流24题】No. 20 深海机器人问题 (费用流)
[题意] 深海资源考察探险队的潜艇将到达深海的海底进行科学考察.潜艇内有多个深海机器人. 潜艇到达深海海底后, 深海机器人将离开潜艇向预定目标移动. 深海机器人在移动中还必须沿途采集海底生物标本. 沿 ...
- 【刷题】LOJ 6224 「网络流 24 题」深海机器人问题
题目描述 深海资源考察探险队的潜艇将到达深海的海底进行科学考察. 潜艇内有多个深海机器人.潜艇到达深海海底后,深海机器人将离开潜艇向预定目标移动. 深海机器人在移动中还必须沿途采集海底生物标本.沿途生 ...
随机推荐
- js分页功能实现
实现一个js的分页并在弹出框中显示 1.分页插件使用:bootstarp-paginator.js,需要先引入bootstarp.js和jquery.js等: !function($){"u ...
- Java基础系列--static关键字
原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/8477914.html 一.概述 static关键字是Java诸多关键字中较常使用的一个,从 ...
- Java经典编程题50道之四十九
计算某字符串中子串出现的次数. public class Example49 { public static void main(String[] args) { String s ...
- Java经典编程题50道之二十八
对10个数进行排序. public class Example28 { public static void main(String[] args) { int[] s = { 5 ...
- ng组件通讯的几种方式
通过输入型绑定把数据从父组件传到子组件. 如<app-hero-child *ngFor="let hero of heroes" [hero]="hero&qu ...
- 使用Netbeans内置的Git工具
在 NetBeans IDE 中使用 Git 支持 NetBeans IDE 为 Git 版本控制客户端提供支持.通过利用 IDE 的 Git 支持,您可以从 IDE 内的项目中直接执行版本控制任务. ...
- 手把手教你在Ubuntu上分别安装Nginx、PHP和Mysql
手把手教你在Ubuntu上分别安装Nginx.PHP和Mysql
- 在windows上安装nginx
在windows上安装nginx 最近自己也尝试了一下在windows上安装nginx,其实非常的简单,这里算是备忘一下. 首先需要到nginx的官网上下载最新版的nginx:http://n ...
- Linux常用软件
网络应用 即时聊天 pidgin 支持多协议,如msn, yahoo, icq, irc ... eva QQ 聊天客户端,KDE程序,推荐 Skype 网络电话,网络聊天,推荐 lumaqq Jav ...
- Android HotFix动态加载框架介绍
HotFix(Deprecated) https://github.com/dodola/HotFix 请关注 RocooFix 我重新写了一个RocooFix框架,解决了Nuwa因为Gradle1. ...