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

题目链接:https://www.luogu.org/problemnew/show/P4011

输入输出样例

输入样例#1:

4 4 9
9
1 2 1 3 2
1 2 2 2 0
2 1 2 2 0
2 1 3 1 0
2 3 3 3 0
2 4 3 4 1
3 2 3 3 0
3 3 4 3 0
4 3 4 4 0
2
2 1 2
4 2 1

输出样例#1:

14

题解:分层图最短路问题。最多就10类门,一看就是状态压缩最大空间 (1<<11)-1 ,很友好...d[i][sta]表示到点i,状态为sta的最短路长度(sta就是到i点前所持有的钥匙的状态)。

代码:

 1 #include <cstdio>
 2 #include <vector>
 3 #include <algorithm>
 4 #include <queue>
 5 #include <cstring>
 6 #define CLR(a, b) memset((a), (b), sizeof((a)))
 7 using namespace std;
 8 const int N = 110;
 9 const int states = 1<<11;
10 const int INF = 0x3f3f3f3f;
11
12 int d[N][states], vis[N][states];
13 int id[N][N];
14 int key[N];     //key[i]:i点有哪些钥匙(状态)
15 int mp[N][N];   //mp[i][j]:i到j有哪类门
16 int dx[] = {1, 0, -1, 0};
17 int dy[] = {0, 1, 0, -1};
18 int n, m, p;
19 struct qnode{
20     int v;
21     int x;//状态
22     qnode(int _v=0,int _x=0):v(_v),x(_x){}
23 };
24 bool SPFA(int st, int ed) {
25     CLR(vis, 0);
26     CLR(d, INF);
27     d[st][0] = 0;
28     queue<qnode> q;
29     while(!q.empty()) q.pop();
30     q.push(qnode(st, 0));
31     while(!q.empty()) {
32         qnode t = q.front(); q.pop();
33         int u = t.v;
34         int sta = t.x;
35         vis[u][sta] = false;
36
37         if(key[u]) sta |= key[u];
38         for(int i = 0; i < 4; i++) {
39             int x = (u+m-1)/m + dx[i];
40             int y = (u%m?u%m:m) + dy[i];
41
42             if(x < 1 || x > n || y < 1 || y > m) continue;
43             int v = id[x][y];
44             //不是墙 并且 有对应钥匙 或者没有门。
45             if(mp[u][v]!=0 && ( (sta&(1<<mp[u][v])) || mp[u][v]==-1)) {
46                 if(d[v][sta] > d[u][t.x] + 1) {
47                     d[v][sta] = d[u][t.x] + 1;
48                     if(!vis[v][sta]) {
49                         vis[v][sta] = true;
50                         q.push(qnode(v, sta));
51                     }
52                 }
53             }
54         }
55     }
56     int ans = INF;
57     for(int i = 0; i < states; ++i) ans = min(ans, d[ed][i]);
58     if(ans == INF) puts("-1");
59     else printf("%d\n", ans);
60 }
61 int main() {
62     int i, j, k, x1, y1, x2, y2, q, sum;
63     scanf("%d%d%d", &n, &m, &p);//行,列,门和墙的总数
64
65     int cnt = 0;
66     for(i = 1; i <= n; ++i)
67         for(j = 1; j <= m; ++j) id[i][j] = ++cnt;
68
69     CLR(mp, -1);
70     scanf("%d", &k);//门和墙总数
71     for(i = 1; i <= k; ++i) {
72         scanf("%d%d%d%d%d", &x1, &y1, &x2, &y2, &q);
73         int id1 = id[x1][y1];
74         int id2 = id[x2][y2];
75         mp[id1][id2] = mp[id2][id1] = q;
76     }
77     scanf("%d", &sum);//钥匙总数
78     for(i = 1; i <= sum; ++i) {
79         scanf("%d%d%d", &x1, &y1, &q);
80         key[id[x1][y1]] |= (1<<q);
81     }
82     SPFA(1, n*m);
83     return 0;
84 }

View Code

转载于:https://www.cnblogs.com/GraceSkyer/p/9022978.html

洛谷 P4011 孤岛营救问题【最短路+分层图】相关推荐

  1. 洛谷 - P4011 孤岛营救问题(bfs+状态压缩)

    题目链接:点击查看 题目大意:给出一个n*m的迷宫,其中有一些边为不可逾越的墙,有一些边为不同型号的门,而钥匙会分布在迷宫的不同位置,求从点(1,1)到点(n,m)的最短时间 题目分析:出现在网络流里 ...

  2. 洛谷 P1948 / loj 10074 / 一本通 1496【分层图】

    坑点:求得是最大边权,dijk需要把求和改成最大值. #include <bits/stdc++.h> #define int long longusing namespace std;v ...

  3. P4011 孤岛营救问题

    P4011 孤岛营救问题 文章目录 输入输出样例 题意: 题解: 代码: 输入输出样例 输入 4 4 9 9 1 2 1 3 2 1 2 2 2 0 2 1 2 2 0 2 1 3 1 0 2 3 3 ...

  4. 洛谷2505 [HAOI2012]道路(最短路计数)

    洛谷传送门 [题目分析] 线段树?bczd,这么小的范围直接暴力就行啦. 直接O(n)枚举源点,每次跑最短路,然后对于每一条路径统计是否在最短路上.两个端点各有多少条最短路径经过即可. [代码~] # ...

  5. 最短路分层图专题 洛谷P2939,4822,4568

    2020.6.3 今天主要练习了下分层图.看洛谷题解每次都能有新收获.今天本来想练dp,后来感觉可能会太自闭了,不如先来一发最短路,毕竟看家本领不能忘.然后点进了北京某年wc的一道题,让求1-n的最短 ...

  6. 洛谷 - P4001 [ICPC-Beijing 2006]狼抓兔子(网格图最大流转换为对偶图最短路)

    题目链接:点击查看 题目大意:给出一张 n * m 的稠密图,求以点 ( 1 , 1 ) 为起点,点 ( n , m ) 为终点的最小割 题目分析:n 和 m 都是 1e3 级别的,最多可能有 1e6 ...

  7. 【洛谷】【二分答案+最短路】P1462 通往奥格瑞玛的道路

    在艾泽拉斯大陆上有一位名叫歪嘴哦的神奇术士,他是部落的中坚力量有一天他醒来后发现自己居然到了联盟的主城暴风城在被众多联盟的士兵攻击后,他决定逃回自己的家乡奥格瑞玛 题目背景 [题目描述:] 在艾泽拉斯 ...

  8. 【2019 CSP-JのT4】[洛谷P5663]加工零件【最短路 · 变式】

    题目描述 linklinklink 凯凯的工厂正在有条不紊地生产一种神奇的零件,神奇的零件的生产过程自然也很神奇.工厂里有 n 位工人,工人们从 1∼n 编号.某些工人之间存在双向的零件传送带.保证每 ...

  9. 洛谷3238 HNOI2014 道路阻塞 最短路 线段树(无代码)

    题目链接 题意: 给你一个nnn个点mmm条边的有向带权图,给你输入一条长度为lll的从111到nnn的最短路,问你把最短路上每一条边删去后从111到nnn的最短路长度是多少. n<=1e5,m ...

最新文章

  1. 线性代数:04 特征值与特征向量 -- 特征值与特征向量
  2. java 取cpuid、主板id、硬盘id、mac地址
  3. 北斗导航 | GPS原理与接收机设计——青冥剑(金码、C/A码、P码)
  4. 为了建设我们的飞鸽传书2011
  5. 程序员必须知道的15件事(转)
  6. JavaScript RegExp(正则)
  7. 了解java虚拟机mdash;非堆相关参数设置(4)
  8. 解决iview中</Input>标签报错的方法
  9. 枚举一个集合的所有子集
  10. 三种分布式爬虫系统的架构方式
  11. 优秀课件笔记之中国园林艺术讲稿
  12. 魔兽争霸3冰封王座 对战初始化被禁止
  13. 干货 | 6大商品数据分析模型分享!
  14. 图片在线去水印-一键图片去除水印工具
  15. TienLen游戏模型、算法,类似斗地主游戏算法
  16. camunda 如何插入或者获取流程审批意见 springboot java实现
  17. php word权限设置密码,在php中加密和解密word docx文件的问题
  18. 2010 我的求职经历(3)
  19. 复指数信号的matlab,复指数函数周期怎么算,为什么复变指数函数是周期函数,而实变指...
  20. UT4418最小Linux系统搭建指南

热门文章

  1. java怎么看dao文件_java通过实体类生成dao文件
  2. kmeans算法_实战 | KMeans 聚类算法
  3. python几多级证书_Openssl 生成多级证书
  4. 【算法竞赛学习】二手车交易价格预测-Task1赛题理解
  5. http超文本传输协议
  6. Linux版本_linux版本信息解析
  7. 教大家白嫖图床,有的小伙伴跟我说图床不好整,太麻烦
  8. latex 表格中虚线_如何识别和修复表格识别中的虚线
  9. 苹果发布新手机,会有多少国人支持呢?
  10. 老干妈如今做到这么大,为什么她就是没遇到竞敌?