火星探险问题


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

[cpp]
  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <queue>
  5. #define ss 0
  6. #define tt 100000
  7. #define INF 0x3f3f3f3f
  8. #define Min(x,y) ((x)<(y)?(x):(y))
  9. #define PLA(x,y) ((x)*qs+(y))
  10. #define ANOTHER 1000
  11. using namespace std;
  12. int n,cnt,ans,ps,qs;
  13. int nxt[100010],head[100010],data[100010];
  14. int flow[100010],wei[100010];
  15. int dis[100010];
  16. int pre[100010];
  17. int maps[100][100];
  18. bool vis[100][100];
  19. queue<int>q;
  20. bool in_stack[100010];
  21. void add(int x,int y,int a,int b){
  22. nxt[cnt]=head[x];data[cnt]=y;wei[cnt]=b;flow[cnt]=a;head[x]=cnt++;
  23. nxt[cnt]=head[y];data[cnt]=x;wei[cnt]=-b;flow[cnt]=0;head[y]=cnt++;
  24. }
  25. bool BFS(){
  26. memset(dis,0x3f,sizeof dis);dis[ss]=0;in_stack[ss]=true;q.push(ss);pre[ss]=pre[tt]=-1;
  27. while(!q.empty()){
  28. int now=q.front();
  29. q.pop();
  30. in_stack[now]=false;
  31. for(int i=head[now];i!=-1;i=nxt[i]){
  32. if(flow[i]!=0&&dis[data[i]]>dis[now]+wei[i]){
  33. dis[data[i]]=dis[now]+wei[i];
  34. pre[data[i]]=i^1;
  35. if(!in_stack[data[i]]){
  36. in_stack[data[i]]=true;
  37. q.push(data[i]);
  38. }
  39. }
  40. }
  41. }
  42. return pre[tt]!=-1;
  43. }
  44. void dfs(){
  45. int Low=INF;
  46. for(int i=pre[tt];i!=-1;i=pre[data[i]])Low=Min(Low,flow[i^1]);
  47. for(int i=pre[tt];i!=-1;i=pre[data[i]])flow[i^1]-=Low,flow[i]+=Low;
  48. ans+=Low*dis[tt];
  49. }
  50. void Dfs(int p1,int p2){
  51. vis[p1][p2]=true;
  52. if(p1+1<=ps&&maps[p1+1][p2]!=1){
  53. if(!maps[p1+1][p2])add(PLA(p1,p2),PLA(p1+1,p2),n,0);
  54. if(maps[p1+1][p2]==2){
  55. add(PLA(p1,p2),PLA(p1+1,p2),n,0);
  56. add(PLA(p1,p2),PLA(p1+1,p2)+ANOTHER,1,0);
  57. }
  58. else add(PLA(p1,p2),PLA(p1+1,p2),n,0);
  59. if(!vis[p1+1][p2])Dfs(p1+1,p2);
  60. }
  61. if(p2+1<=qs&&maps[p1][p2+1]!=1){
  62. if(!maps[p1][p2+1])add(PLA(p1,p2),PLA(p1,p2+1),n,0);
  63. if(maps[p1][p2+1]==2){
  64. add(PLA(p1,p2),PLA(p1,p2+1),n,0);
  65. add(PLA(p1,p2),PLA(p1,p2+1)+ANOTHER,1,0);
  66. }
  67. else add(PLA(p1,p2),PLA(p1,p2+1),n,0);
  68. if(!vis[p1][p2+1])Dfs(p1,p2+1);
  69. }
  70. }
  71. int main(){
  72. memset(head,-1,sizeof head);
  73. scanf(”%d%d%d”,&n,&qs,&ps);
  74. for(int i=1;i<=ps;i++)
  75. for(int j=1;j<=qs;j++){
  76. scanf(”%d”,&maps[i][j]);
  77. add(PLA(i,j)+ANOTHER,PLA(i,j),1,-1);
  78. }
  79. Dfs(1,1);
  80. add(ss,PLA(1,1),n,0);
  81. add(PLA(ps,qs),tt,n,0);
  82. while(BFS())dfs();
  83. if(maps[ps][qs]==2)ans++;
  84. if(maps[1][1]==2)ans++;
  85. printf(”%d\n”,-ans);
  86. return 0;
  87. }

网络流二十四题之二十二 —— 火星探险问题相关推荐

  1. 【Visual C++】游戏开发五十四 浅墨DirectX教程二十一 视觉的诡计 公告板 Billboard 技术

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 本系列文 ...

  2. 【Visual C++】游戏开发五十四 浅墨DirectX教程二十一 视觉的诡计:公告板(Billboard)技术...

    本系列文章由zhmxy555(毛星云)编写,转载请注明出处. 作者:毛星云(浅墨)   微博:@浅墨_毛星云邮箱: happylifemxy@163.com I'm back~,这段时间大家久等了~ ...

  3. 第十四题: 以下代码的输出结果是?

    第十四题: 以下代码的输出结果是? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 public class B {     public static B t1 = n ...

  4. ceres快速教材及学习笔记(四)bundl adjustment,《视觉slam十四讲》第十讲ceres例子

    0. 前言 本文是根据ceres官方教程内容ceres-solver官方教程链接,再结合自己理解的一个ceres快速学习笔记. 在博文ceres快速教材及学习笔记(一)hello,world!中,我们 ...

  5. 计算机 游戏第14关,《帕拉世界》第十四关至第十六关攻略秘籍

    <帕拉世界>第十四关至第十六关攻略秘籍 2016-11-21 16:37:41来源:游戏下载编辑:评论(0) 第十四关:一开始没必要强攻监狱,部队沿着山道向上,在左上角的出海口那里建立基地 ...

  6. 2017计算机二c语言题库,2017计算机二c语言题库试题及答案

    2017计算机二c语言题库试题及答案 计算机在各行各业中的广泛应用,常常产生显著的经济效益和社会效益,从而引起产业结构.产品结构.经营管理和服务方式等方面的重大变革.下面是小编整理的关于计算机二c语言 ...

  7. 【[网络流二十四题]最长不下降子序列问题】

    题目 啥都不会只能来写写题解了 第一问先搞一个\(dp\)吧,小学生水平的\(dp\) 第二问要求每一个点只能使用一次,显然要先拆点,把\(i\)拆成\(i\)与\(i'\),之后\(i\)于\(i' ...

  8. 网络流二十四题 ————(二十一)、P3358 最长k可重区间集问题 费用流并联与串联选择

    https://www.luogu.com.cn/problem/solution/P3358 洛谷大佬们题解写的很棒,我就不献丑了. 说下我的理解吧,可以把这个限制过程当初物理中的电路并联与串联.流 ...

  9. 计算机基础二,四,八,十,32,64进制 转换规律

    计算机基础进制 计算机常用进制: 二进制 八进制 十进制 16进制 计算机操作系统进制: 二进制 为什么采用二进制? (1)技术上容易实现.用双稳态电路表示二进制数字0和1是很容易的事情. 计算机使用 ...

最新文章

  1. UI设计培训怎么选择就业方向
  2. Java开发小技巧(五):HttpClient工具类
  3. 【论文解读】从BERT和XLNet到MPNet
  4. 【CV】54篇最新CV领域综述论文速递!涵盖14个方向:目标检测/图像分割/医学影像/人脸识别等方向...
  5. 化工原理各章知识点汇总
  6. 什么是 TypeScript 变量的 declared type
  7. 工作315:uni-修改添加时间的逻辑
  8. 【HDU - 6290】 奢侈的旅行 (对题目预处理 + DIjkstra最短路)
  9. 字典的定义、字典的特性(成员操作符)
  10. C# 计时工具 Stopwatch
  11. js:使用a标签下载图片及pdf文件等资源
  12. 软件过程管理课程知识点总结
  13. 【python】GUI thinter窗口最大化
  14. Python毕业设计开题报告职业推荐系统
  15. 理解 B 树、B+ 树特点及使用场景
  16. stm32mp1开发板入门pangu
  17. 微信彩色字体图标的使用
  18. MySQL数据库技术 第二版 章末 答案—单元5---思考5
  19. java连续多位相同字符判断的正则表达式_java连续多位相同字符判断的正则表达式...
  20. 简单易学的机器学习算法——非线性支持向量机

热门文章

  1. linux系统下的动态壁纸,Ubuntu 10.04下实现动态桌面壁纸
  2. python 公司年会抽奖_python实现年会抽奖程序
  3. ASUS华硕天选笔记本电脑FA506IV4900显卡2060原装出厂Windows10系统恢复原厂OEM系统
  4. 奥特曼传奇英雄存档丢了怎么找回_奥特曼传奇英雄存档
  5. 此次自驾车回家,途中吉凶情况如何?
  6. Linux 流量监控软件 NetHogs
  7. EEPROM数据丢失
  8. Angular 小专题:玩转注射器
  9. win7显卡nvidi466.77驱动和补丁KB4474419和KB4490628
  10. 嘿嘿嘿,你还不知道呢?软件测试自学网站