LuoguP4012 深海机器人问题(费用流)
题目描述
深海资源考察探险队的潜艇将到达深海的海底进行科学考察。
潜艇内有多个深海机器人。潜艇到达深海海底后,深海机器人将离开潜艇向预定目标移动。
深海机器人在移动中还必须沿途采集海底生物标本。沿途生物标本由最先遇到它的深海机器人完成采集。
每条预定路径上的生物标本的价值是已知的,而且生物标本只能被采集一次。
本题限定深海机器人只能从其出发位置沿着向北或向东的方向移动,而且多个深海机器人可以在同一时间占据同一位置。
用一个P×Q 网格表示深海机器人的可移动位置。西南角的坐标为 (0,0),东北角的坐标为 (Q,P) 。
给定每个深海机器人的出发位置和目标位置,以及每条网格边上生物标本的价值。
计算深海机器人的最优移动方案, 使深海机器人到达目的地后,采集到的生物标本的总价值最高。
输入输出格式
输入格式:
文件的第 1 行为深海机器人的出发位置数 a,和目的地数 b 。
第 2 行为 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行输入时横纵坐标要反过来
输出格式:
输出采集到的生物标本的最高总价值.
解题思路:
输入喷我一脸。
在边界建两条流,一条流量为1有费用,一条为0无费用
代码:
1 #include<queue> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 const int oo=0x3f3f3f3f; 6 struct pnt{ 7 int hd; 8 int pre; 9 int lst; 10 int dis; 11 int val; 12 bool vis; 13 }p[100000]; 14 struct ent{ 15 int twd; 16 int lst; 17 int vls; 18 int dis; 19 }e[1000000]; 20 int cnt; 21 int n,m; 22 int s,t; 23 int ns,nt; 24 int no[101][101]; 25 std::queue<int>Q; 26 void ade(int f,int t,int v,int d) 27 { 28 cnt++; 29 e[cnt].twd=t; 30 e[cnt].vls=v; 31 e[cnt].dis=d; 32 e[cnt].lst=p[f].hd; 33 p[f].hd=cnt; 34 return ; 35 } 36 bool Spfa(void) 37 { 38 for(int i=1;i<=t;i++) 39 { 40 p[i].dis=p[i].val=oo; 41 p[i].vis=false; 42 } 43 p[t].pre=-1; 44 p[s].dis=0; 45 p[s].vis=true; 46 while(!Q.empty()) 47 Q.pop(); 48 Q.push(s); 49 while(!Q.empty()) 50 { 51 int x=Q.front(); 52 Q.pop(); 53 p[x].vis=false; 54 for(int i=p[x].hd;i;i=e[i].lst) 55 { 56 int to=e[i].twd; 57 if(p[to].dis>p[x].dis+e[i].dis&&e[i].vls>0) 58 { 59 p[to].dis=p[x].dis+e[i].dis; 60 p[to].val=std::min(p[x].val,e[i].vls); 61 p[to].pre=x; 62 p[to].lst=i; 63 if(p[to].vis) 64 continue; 65 p[to].vis=true; 66 Q.push(to); 67 } 68 } 69 } 70 return p[t].pre!=-1; 71 } 72 int Ek(void) 73 { 74 int ans=0; 75 while(Spfa()) 76 { 77 ans+=p[t].dis*p[t].val; 78 for(int i=t;i!=s;i=p[i].pre) 79 { 80 e[p[i].lst].vls-=p[t].val; 81 e[((p[i].lst-1)^1)+1].vls+=p[t].val; 82 } 83 } 84 return ans; 85 } 86 int main() 87 { 88 // freopen("a.in","r",stdin); 89 scanf("%d%d",&ns,&nt); 90 scanf("%d%d",&n,&m); 91 for(int i=0;i<=n;i++) 92 for(int j=0;j<=m;j++) 93 no[i][j]=++cnt; 94 s=cnt+1; 95 t=cnt+2; 96 cnt=0; 97 for(int i=0;i<=n;i++) 98 { 99 for(int j=0;j<m;j++) 100 { 101 int x; 102 scanf("%d",&x); 103 ade(no[i][j],no[i][j+1],1,-x); 104 ade(no[i][j+1],no[i][j],0,x); 105 ade(no[i][j],no[i][j+1],oo,0); 106 ade(no[i][j+1],no[i][j],0,0); 107 } 108 } 109 for(int j=0;j<=m;j++) 110 { 111 for(int i=0;i<n;i++) 112 { 113 int x; 114 scanf("%d",&x); 115 ade(no[i][j],no[i+1][j],1,-x); 116 ade(no[i+1][j],no[i][j],0,x); 117 ade(no[i][j],no[i+1][j],oo,0); 118 ade(no[i+1][j],no[i][j],0,0); 119 } 120 } 121 for(int i=1;i<=ns;i++) 122 { 123 int a,b,c; 124 scanf("%d%d%d",&c,&a,&b); 125 ade(s,no[a][b],c,0); 126 ade(no[a][b],s,0,0); 127 } 128 for(int i=1;i<=nt;i++) 129 { 130 int a,b,c; 131 scanf("%d%d%d",&c,&a,&b); 132 ade(no[a][b],t,c,0); 133 ade(t,no[a][b],0,0); 134 } 135 printf("%d\n",-Ek()); 136 return 0; 137 }
转载于:https://www.cnblogs.com/blog-Dr-J/p/10210827.html
LuoguP4012 深海机器人问题(费用流)相关推荐
- 【图论】【网络流】费用流模型
费用流模型 费用流板子 费用流直接应用 运输问题 负载平衡问题 二分图最大匹配 分配问题 最大权不相交路径 数字梯形问题 费用流网格图模型 K取方格数 深海机器人问题 费用流拆点 餐巾计划问题 费用流 ...
- 洛谷 P4012 深海机器人问题【费用流】
题目链接:https://www.luogu.org/problemnew/show/P4012 洛谷 P4012 深海机器人问题 输入输出样例 输入样例#1: 1 1 2 2 1 2 3 4 5 6 ...
- [洛谷P4012] [网络流24题] 深海机器人问题
Description 深海资源考察探险队的潜艇将到达深海的海底进行科学考察. 潜艇内有多个深海机器人.潜艇到达深海海底后,深海机器人将离开潜艇向预定目标移动. 深海机器人在移动中还必须沿途采集海底生 ...
- [BZOJ 1221][HNOI2001]软件开发(费用流)
Description 某软件公司正在规划一项n天的软件开发计划,根据开发计划第i天需要ni个软件开发人员,为了提高软件开发人员的效率,公司给软件人员提供了很多的服务,其中一项服务就是要为每个开发人员 ...
- 费用流 -- 四川省赛F-Direction Setting [拆边成点+费用流]
题目链接 题目大意: 就是给你一个nnn个点mmm条边的无向图,每个点有个值是aia_iai现在你把每条边都赋予一个方向之后这个图就是有向图了,那么设第iii个点的入度是did_idi,现在设 D ...
- UVA1411 Ants(带权二分图的最大完美匹配、zkw费用流)
题解 给定一些黑点白点,要求一个黑点链接一个白点并且线段不相交(转成二分图最大权匹配使用费用流解决)<训练指南>P351 输出方案:满流即为答案(满流是指这条路的流量跑满了,也就是说edg ...
- 餐巾计划问题 线性规划与网络流24题之10 费用流
相关知识:最小费用(最大)流 问题描述: 一个餐厅在相继的N 天里, 每天需用的餐巾数不尽相同. 假设第i天需要ri块餐巾(i=1, 2,-,N).餐厅可以购买新的餐巾,每块餐巾的费用为p分:或者把旧 ...
- BZOJ1150[CTSC2007]数据备份Backup——模拟费用流+堆+链表
题目描述 你在一家 IT 公司为大型写字楼或办公楼(offices)的计算机数据做备份.然而数据备份的工作是枯燥乏味 的,因此你想设计一个系统让不同的办公楼彼此之间互相备份,而你则坐在家中尽享计算机游 ...
- bzoj3171: [Tjoi2013]循环格(费用流)
传送门 其实这题的建图并不难(虽然我并没有想出来) 首先,每一个点的入度和出度必须为$1$ 那么我们考虑拆点 每个点的出度点向它能到达的点的入度点连边,容量$1$,如果方向为原来的方向则费用$0$否则 ...
- 洛谷 - P2045 - 方格取数加强版 - 费用流
原来这种题的解法是费用流. 从一个方格的左上走到右下,最多走k次,每个数最多拿走一次. 每次走动的流量设为1,起始点拆点成限制流量k. 每个点拆成两条路,一条路限制流量1,费用为价值相反数.另一条路无 ...
最新文章
- ubuntu下使用Eclipse下搭建c开发环境
- 芯片短缺加剧,上半年汽车销量逆势上涨的丰田也扛不住了,9月减产40%
- HTML5中的CSS Shader技术
- Spring Security——基于读写锁的动态权限配置FilterInvocationSecurityMetadataSource实现类
- jQuery 判断元素是否在屏幕可见区域内
- apache安全—用户访问控制
- java jar 源码乱码,java使用jar包时出现乱码的解决方法
- gcc编译流程及中间表示层RTL的探索
- LeetCode 1216. 验证回文字符串 III(DP)
- mysql 游标中实现递归_mysql中实现递归查询?
- 漫话:是时候说说到底什么是 IPv4 和 IPv6 了!
- visio网络拓扑图 下载_Visio2019软件下载及安装教程
- Linux系统多网卡环境下的路由配置
- 华硕主板开机:loading asus express gate解决办法
- 2022年聚合工艺特种作业证考试题库及在线模拟考试
- 软考软件设计师-软件工程基础知识
- 年薪50万的程序员_2018年这类程序员工资最高!年薪50万只能算一般
- 自定义智能报表系统内容准备:基于WEB的SBO数据结构浏览器
- 我的大学-5-34-林陆
- C++源文件到可执行程序
热门文章
- 拓端tecdat|R语言股市可视化相关矩阵:最小生成树
- 【大数据部落】文本挖掘:twitter推特LDA主题情感分析
- 永久更改打开matlab时工作目录
- python sdk怎么用_python - alipay sdk 使用 及 注意点
- java日历制作日期不对_在我的代码中,为什么Java日期或日历中的月份日期不同? - java...
- pandas如何往mysql追加数据
- 神经网络入门学习-一些基本的概念+不含隐层
- sublimeText3安装、激活、环境配置与代码补全神器Kite安装配置
- python实现完整的特征工程,实践论文中的分类模型和方法用于恶意页面的分类与识别
- vs中能编译通过,但是会有红色下划线提示未定义标示符问题