网络流二十四题之二十二 —— 火星探险问题
火星探险问题
Description
火星探险队的登陆舱将在火星表面着陆,登陆舱内有多部障碍物探测车。
登陆舱着陆后,探测车将离开登陆舱向先期到达的传送器方向移动。
探测车在移动中还必须采集岩石标本。
每一块岩石标本由最先遇到它的探测车完成采集。
每块岩石标本只能被采集一次。
岩石标本被采集后,其他探测车可以从原来岩石标本所在处通过。
探测车不能通过有障碍的地面。
本题限定探测车只能从登陆处沿着向南或向东的方向朝传送器移动,而且多个探测车可以在同一时间占据同一位置。
如果某个探测车在到达传送器以前不能继续前进,则该车所采集的岩石标本将全部损失。
用一个PXQ 网格表示登陆舱与传送器之间的位置。登陆舱的位置在( X1,Y1 X_1,Y_1)处,传送器的位置在( XP,YQ X_P ,Y_Q)处。
给定每个位置的状态,计算探测车的最优移动方案,使到达传送器的探测车的数量最多,而且探测车采集到的岩石标本的数量最多。
Input
第 1 1 行为探测车数,第 22 行为 P P 的值,第 33 行为 Q Q 的值。
接下来的 QQ 行是表示登陆舱与传送器之间的位置状态的 PXQ 网格。
用 3 3 个数字表示火星表面位置的状态:00 表示平坦无障碍, 1 1 表示障碍,22 表示石块。
Output
程序运行结束时,将能探索到的岩石标本数目输出。
Sample Input
2
10
8
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 1 1 0 0 0
0 0 0 1 0 2 0 0 0 0
1 1 0 1 2 0 0 0 0 1
0 1 0 0 2 0 1 1 0 0
0 1 0 1 0 0 1 1 0 0
0 1 2 0 0 0 0 1 0 0
0 0 0 0 0 0 0 0 0 0
Sample Output
2
Solution
我们把每个格子与他能够到达的格子连一条边。
如果此格子有岩石标本,那么就再加一个点,再连一条容量为 1 <script type="math/tex" id="MathJax-Element-13">1</script> 的边到这个点,然后从这个点连一条边回到这个格子。
跑一遍最大费用流就行了。
Code
- #include <iostream>
- #include <cstdio>
- #include <cstring>
- #include <queue>
- #define ss 0
- #define tt 100000
- #define INF 0x3f3f3f3f
- #define Min(x,y) ((x)<(y)?(x):(y))
- #define PLA(x,y) ((x)*qs+(y))
- #define ANOTHER 1000
- using namespace std;
- int n,cnt,ans,ps,qs;
- int nxt[100010],head[100010],data[100010];
- int flow[100010],wei[100010];
- int dis[100010];
- int pre[100010];
- int maps[100][100];
- bool vis[100][100];
- queue<int>q;
- bool in_stack[100010];
- void add(int x,int y,int a,int b){
- nxt[cnt]=head[x];data[cnt]=y;wei[cnt]=b;flow[cnt]=a;head[x]=cnt++;
- nxt[cnt]=head[y];data[cnt]=x;wei[cnt]=-b;flow[cnt]=0;head[y]=cnt++;
- }
- bool BFS(){
- memset(dis,0x3f,sizeof dis);dis[ss]=0;in_stack[ss]=true;q.push(ss);pre[ss]=pre[tt]=-1;
- while(!q.empty()){
- int now=q.front();
- q.pop();
- in_stack[now]=false;
- for(int i=head[now];i!=-1;i=nxt[i]){
- if(flow[i]!=0&&dis[data[i]]>dis[now]+wei[i]){
- dis[data[i]]=dis[now]+wei[i];
- pre[data[i]]=i^1;
- if(!in_stack[data[i]]){
- in_stack[data[i]]=true;
- q.push(data[i]);
- }
- }
- }
- }
- return pre[tt]!=-1;
- }
- void dfs(){
- int Low=INF;
- for(int i=pre[tt];i!=-1;i=pre[data[i]])Low=Min(Low,flow[i^1]);
- for(int i=pre[tt];i!=-1;i=pre[data[i]])flow[i^1]-=Low,flow[i]+=Low;
- ans+=Low*dis[tt];
- }
- void Dfs(int p1,int p2){
- vis[p1][p2]=true;
- if(p1+1<=ps&&maps[p1+1][p2]!=1){
- if(!maps[p1+1][p2])add(PLA(p1,p2),PLA(p1+1,p2),n,0);
- if(maps[p1+1][p2]==2){
- add(PLA(p1,p2),PLA(p1+1,p2),n,0);
- add(PLA(p1,p2),PLA(p1+1,p2)+ANOTHER,1,0);
- }
- else add(PLA(p1,p2),PLA(p1+1,p2),n,0);
- if(!vis[p1+1][p2])Dfs(p1+1,p2);
- }
- if(p2+1<=qs&&maps[p1][p2+1]!=1){
- if(!maps[p1][p2+1])add(PLA(p1,p2),PLA(p1,p2+1),n,0);
- if(maps[p1][p2+1]==2){
- add(PLA(p1,p2),PLA(p1,p2+1),n,0);
- add(PLA(p1,p2),PLA(p1,p2+1)+ANOTHER,1,0);
- }
- else add(PLA(p1,p2),PLA(p1,p2+1),n,0);
- if(!vis[p1][p2+1])Dfs(p1,p2+1);
- }
- }
- int main(){
- memset(head,-1,sizeof head);
- scanf(”%d%d%d”,&n,&qs,&ps);
- for(int i=1;i<=ps;i++)
- for(int j=1;j<=qs;j++){
- scanf(”%d”,&maps[i][j]);
- add(PLA(i,j)+ANOTHER,PLA(i,j),1,-1);
- }
- Dfs(1,1);
- add(ss,PLA(1,1),n,0);
- add(PLA(ps,qs),tt,n,0);
- while(BFS())dfs();
- if(maps[ps][qs]==2)ans++;
- if(maps[1][1]==2)ans++;
- printf(”%d\n”,-ans);
- return 0;
- }
网络流二十四题之二十二 —— 火星探险问题相关推荐
- 【Visual C++】游戏开发五十四 浅墨DirectX教程二十一 视觉的诡计 公告板 Billboard 技术
分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 本系列文 ...
- 【Visual C++】游戏开发五十四 浅墨DirectX教程二十一 视觉的诡计:公告板(Billboard)技术...
本系列文章由zhmxy555(毛星云)编写,转载请注明出处. 作者:毛星云(浅墨) 微博:@浅墨_毛星云邮箱: happylifemxy@163.com I'm back~,这段时间大家久等了~ ...
- 第十四题: 以下代码的输出结果是?
第十四题: 以下代码的输出结果是? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 public class B { public static B t1 = n ...
- ceres快速教材及学习笔记(四)bundl adjustment,《视觉slam十四讲》第十讲ceres例子
0. 前言 本文是根据ceres官方教程内容ceres-solver官方教程链接,再结合自己理解的一个ceres快速学习笔记. 在博文ceres快速教材及学习笔记(一)hello,world!中,我们 ...
- 计算机 游戏第14关,《帕拉世界》第十四关至第十六关攻略秘籍
<帕拉世界>第十四关至第十六关攻略秘籍 2016-11-21 16:37:41来源:游戏下载编辑:评论(0) 第十四关:一开始没必要强攻监狱,部队沿着山道向上,在左上角的出海口那里建立基地 ...
- 2017计算机二c语言题库,2017计算机二c语言题库试题及答案
2017计算机二c语言题库试题及答案 计算机在各行各业中的广泛应用,常常产生显著的经济效益和社会效益,从而引起产业结构.产品结构.经营管理和服务方式等方面的重大变革.下面是小编整理的关于计算机二c语言 ...
- 【[网络流二十四题]最长不下降子序列问题】
题目 啥都不会只能来写写题解了 第一问先搞一个\(dp\)吧,小学生水平的\(dp\) 第二问要求每一个点只能使用一次,显然要先拆点,把\(i\)拆成\(i\)与\(i'\),之后\(i\)于\(i' ...
- 网络流二十四题 ————(二十一)、P3358 最长k可重区间集问题 费用流并联与串联选择
https://www.luogu.com.cn/problem/solution/P3358 洛谷大佬们题解写的很棒,我就不献丑了. 说下我的理解吧,可以把这个限制过程当初物理中的电路并联与串联.流 ...
- 计算机基础二,四,八,十,32,64进制 转换规律
计算机基础进制 计算机常用进制: 二进制 八进制 十进制 16进制 计算机操作系统进制: 二进制 为什么采用二进制? (1)技术上容易实现.用双稳态电路表示二进制数字0和1是很容易的事情. 计算机使用 ...
最新文章
- UI设计培训怎么选择就业方向
- Java开发小技巧(五):HttpClient工具类
- 【论文解读】从BERT和XLNet到MPNet
- 【CV】54篇最新CV领域综述论文速递!涵盖14个方向:目标检测/图像分割/医学影像/人脸识别等方向...
- 化工原理各章知识点汇总
- 什么是 TypeScript 变量的 declared type
- 工作315:uni-修改添加时间的逻辑
- 【HDU - 6290】 奢侈的旅行 (对题目预处理 + DIjkstra最短路)
- 字典的定义、字典的特性(成员操作符)
- C# 计时工具 Stopwatch
- js:使用a标签下载图片及pdf文件等资源
- 软件过程管理课程知识点总结
- 【python】GUI thinter窗口最大化
- Python毕业设计开题报告职业推荐系统
- 理解 B 树、B+ 树特点及使用场景
- stm32mp1开发板入门pangu
- 微信彩色字体图标的使用
- MySQL数据库技术 第二版 章末 答案—单元5---思考5
- java连续多位相同字符判断的正则表达式_java连续多位相同字符判断的正则表达式...
- 简单易学的机器学习算法——非线性支持向量机
热门文章
- linux系统下的动态壁纸,Ubuntu 10.04下实现动态桌面壁纸
- python 公司年会抽奖_python实现年会抽奖程序
- ASUS华硕天选笔记本电脑FA506IV4900显卡2060原装出厂Windows10系统恢复原厂OEM系统
- 奥特曼传奇英雄存档丢了怎么找回_奥特曼传奇英雄存档
- 此次自驾车回家,途中吉凶情况如何?
- Linux 流量监控软件 NetHogs
- EEPROM数据丢失
- Angular 小专题:玩转注射器
- win7显卡nvidi466.77驱动和补丁KB4474419和KB4490628
- 嘿嘿嘿,你还不知道呢?软件测试自学网站