关键词:分层图 状态压缩 最短路径

分层图:现在要求从起点到终点的最优路线,但受到手里拿着哪些钥匙的影响,最优路线不单纯了。因此,决定一个节点、一条边的存在的数中应当增加一个手中拿有钥匙的状态。这样就相当于把一张图按拿有钥匙的状态数分出了很多层。

状态压缩:手中拿有钥匙的状态可以压缩到一个整数中。

最短路径:手中拿有钥匙的状态固定了,在分层图中我们就不再用得着走回头路了。这样就转化成了最短路径问题。

  1. #include <cstdio>
  2. #include <cassert>
  3. #include <cstring>
  4. #include <algorithm>
  5. #include <cmath>
  6. using namespace std;
  7.  
  8. const int MAX_X = , MAX_Y = , MAX_KEY = , MAX_S = << , INF = 0x3f3f3f3f;
  9. int Dist[MAX_X][MAX_Y][MAX_S];
  10. int Key[MAX_X][MAX_Y];
  11. int Gate[MAX_X][MAX_Y][MAX_X][MAX_Y];
  12. int TotX, TotY;
  13. const int xNext[] = { ,-,,, }, yNext[] = { , ,,-, };
  14.  
  15. struct Queue
  16. {
  17. int xs[MAX_X*MAX_Y*MAX_S], ys[MAX_X*MAX_Y*MAX_S], ss[MAX_X*MAX_Y*MAX_S];
  18. int head, tail;
  19. Queue() { head = tail = ; }
  20. void push(int x, int y, int s) { xs[tail] = x; ys[tail] = y; ss[tail] = s; tail++; }
  21. void pop() { head++; }
  22. bool empty() { return head == tail; }
  23. int frontX() { return xs[head]; }
  24. int frontY() { return ys[head]; }
  25. int frontS() { return ss[head]; }
  26. };
  27.  
  28. int Bfs()
  29. {
  30. int ans = INF;
  31. static Queue q;
  32. Dist[][][Key[][]] = ;
  33. q.push(, , Key[][]);
  34. while (!q.empty())
  35. {
  36. int x = q.frontX(), y = q.frontY(), s = q.frontS();
  37. q.pop();
  38. Dist[x][y][s | Key[x][y]] = Dist[x][y][s];
  39. s |= Key[x][y];
  40. for (int p = ; p <= ; p++)
  41. {
  42. int x2 = x + xNext[p], y2 = y + yNext[p];
  43. if (x2 >= && x2 <= TotX && y2 >= && y2 <= TotY &&
  44. Dist[x2][y2][s]==INF &&
  45. (Gate[x][y][x2][y2] == - || s&( << Gate[x][y][x2][y2])))
  46. {
  47. Dist[x2][y2][s] = Dist[x][y][s] + ;
  48. q.push(x2, y2, s);
  49. if (x2 == TotX&&y2 == TotY)
  50. ans = min(ans, Dist[x2][y2][s]);
  51. }
  52. }
  53. }
  54. return ans;
  55. }
  56.  
  57. int main()
  58. {
  59. #ifdef _DEBUG
  60. freopen("c:\\noi\\source\\input.txt", "r", stdin);
  61. #endif
  62. int totObs, totKeySort, x1, x2, y1, y2, gate, totKey, key;
  63. memset(Gate, -, sizeof(Gate));
  64. memset(Dist, INF, sizeof(Dist));
  65. scanf("%d%d%d%d", &TotX, &TotY, &totKeySort, &totObs);
  66. while (totObs--)
  67. {
  68. scanf("%d%d%d%d%d", &x1, &y1, &x2, &y2, &gate);
  69. Gate[x1][y1][x2][y2] = Gate[x2][y2][x1][y1] = gate;
  70. }
  71. scanf("%d", &totKey);
  72. while (totKey--)
  73. {
  74. scanf("%d%d%d", &x1, &y1, &key);
  75. if (key >= )
  76. printf("error\n");
  77. Key[x1][y1] |= << key;
  78. }
  79. int ans = Bfs();
  80. if (ans == INF)
  81. printf("-1\n");
  82. else
  83. printf("%d\n", ans);
  84. return ;
  85. }

luogu4011 孤岛营救问题 分层图的更多相关文章

  1. 【网络流24题】 No.14 孤岛营救问题 (分层图最短路)

    [题意] 1944 年,特种兵麦克接到国防部的命令,要求立即赶赴太平洋上的一个孤岛, 营救被敌军俘虏的大兵瑞恩. 瑞恩被关押在一个迷宫里, 迷宫地形复杂, 但幸好麦克得到了迷宫的地形图. 迷宫的外形是 ...

  2. 洛谷 P4011 孤岛营救问题【最短路+分层图】

    题外话:昨夜脑子昏沉,今早一调试就过了...错误有:我忘记还有墙直接穿墙过...memset初始化INF用错了数...然后手残敲错一个状态一直过不了样例...要是这状态去比赛我简直完了......or ...

  3. [CODEVS1911] 孤岛营救问题(分层图最短路)

    传送门 吐槽:神tm网络流... 用持有的钥匙分层,状态压缩,用 2 进制表示持有的钥匙集合. dis[i][j][k] 表示持有的钥匙集合为 k,到达点 (i, j) 的最短路径. 分层图的最短路听 ...

  4. [CTSC 1999]拯救大兵瑞恩&[网络流24题]孤岛营救问题

    Description $1944$ 年,特种兵麦克接到国防部的命令,要求立即赶赴太平洋上的一个孤岛,营救被敌军俘虏的大兵瑞恩.瑞恩被关押在一个迷宫里,迷宫地形复杂,但幸好麦克得到了迷宫的地形图.迷宫 ...

  5. 「LOJ#6121」「网络流 24 题」孤岛营救问题(BFS

    题目描述 1944 年,特种兵麦克接到国防部的命令,要求立即赶赴太平洋上的一个孤岛,营救被敌军俘虏的大兵瑞恩.瑞恩被关押在一个迷宫里,迷宫地形复杂,但幸好麦克得到了迷宫的地形图.迷宫的外形是一个长方形 ...

  6. Luogu P4011 孤岛营救问题(状态压缩+最短路)

    P4011 孤岛营救问题 题意 题目描述 \(1944\)年,特种兵麦克接到国防部的命令,要求立即赶赴太平洋上的一个孤岛,营救被敌军俘虏的大兵瑞恩.瑞恩被关押在一个迷宫里,迷宫地形复杂,但幸好麦克得到 ...

  7. 【BZOJ-3627】路径规划 分层图 + Dijkstra + spfa

    3627: [JLOI2014]路径规划 Time Limit: 30 Sec  Memory Limit: 128 MBSubmit: 186  Solved: 70[Submit][Status] ...

  8. ACdream 1017 [分层图][网络流]

    /* 大连热身C题 不要低头,不要放弃,不要气馁,不要慌张 题意: 给一个城市路线图,给定起点给定终点.有n个货物从起点运送到终点.城市的边是无向边. 每个货物每天如果通过某条路,那么这天这条路只能运 ...

  9. poj3635Full Tank?[分层图最短路]

    Full Tank? Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7248   Accepted: 2338 Descri ...

随机推荐

  1. 理解java中的ThreadLocal 专题

    ThreadLocal每一印象: public class IncrementWithStaticVariable{ private static int seqNum = 0; public int ...

  2. lnmp 安装FTP服务 并配置FTP用户

    lnmp 默认是不带FTP服务的,需要的童鞋要自行安装.步骤也很简单 一,进入lnmp目录,找到pureftpd.sh 二,直接运行该脚本 ./pureftpd.sh 按任意键开始安装,等待,安装成功 ...

  3. OpenVX

    OpenVX openvx  1. 编译 尝试编译openvx_sample,下载相关代码. 下载的sample code直接使用make可以生成libopenvx.so. 使用python Buil ...

  4. 【原创】python中文编码问题深入分析(三):python2.7文件读写中文编码问题

    上一篇文章介绍和分析了python2.7中使用print遇到的中文编码问题的原因和解决方案,本篇主要介绍一下python2.7中执行文件读写可能遇到的编码问题. 1.文件读取 假如我们读取一个文件,文 ...

  5. ES:AI 注释

    为AI做注解: AI已经出第三版,大的框架没有改变,DNN也没有引入AI这本书.第四版网络版应流出,不知道最终定版如何! 强化学习的方法有大幅度更新,但从策略系统更新范畴看来,没有什么实质的改变,只是 ...

  6. phpStudy 升级 MySQL版本

    1:停止phpStudy ,Mysql 服务;删除Mysql 文件夹 替换为新版本的Mysql 2:复制一份 my-default.ini,改名 my.ini ,打开,在最后面加上: basedir= ...

  7. PAT_A1144#The Missing Number

    Source: PAT A1144 The Missing Number (20 分) Description: Given N integers, you are supposed to find ...

  8. python基础1 格式化输出

    转载自:https://www.cnblogs.com/fat39/p/7159881.html %用法 1.整数输出 %o —— oct 八进制%d —— dec 十进制%x —— hex 十六进制 ...

  9. 【编程工具】Vim编辑器的使用

    1.Vim简介   Vim最初起源于古老的贝尔实验室,由"Bram Moolenaar等人"开发,是一个功能强大的文本编辑器,被推崇为类Vi编辑器中最好的一个.   Vim是一个类 ...

  10. 拷贝构造和拷贝赋值、静态成员(static)、成员指针、操作符重载(day06)

    十七 拷贝构造和拷贝赋值 浅拷贝和深拷贝 )如果一个类中包含指针形式的成员变量,缺省的拷贝构造函数只是复制了指针变量的本身,而没有复制指针所指向的内容,这种拷贝方式称为浅拷贝. )浅拷贝将导致不同对象 ...