题外话:昨夜脑子昏沉,今早一调试就过了...错误有:我忘记还有墙直接穿墙过...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点前所持有的钥匙的状态)。

代码:

 #include <cstdio>
#include <vector>
#include <algorithm>
#include <queue>
#include <cstring>
#define CLR(a, b) memset((a), (b), sizeof((a)))
using namespace std;
const int N = ;
const int states = <<;
const int INF = 0x3f3f3f3f; int d[N][states], vis[N][states];
int id[N][N];
int key[N]; //key[i]:i点有哪些钥匙(状态)
int mp[N][N]; //mp[i][j]:i到j有哪类门
int dx[] = {, , -, };
int dy[] = {, , , -};
int n, m, p;
struct qnode{
int v;
int x;//状态
qnode(int _v=,int _x=):v(_v),x(_x){}
};
bool SPFA(int st, int ed) {
CLR(vis, );
CLR(d, INF);
d[st][] = ;
queue<qnode> q;
while(!q.empty()) q.pop();
q.push(qnode(st, ));
while(!q.empty()) {
qnode t = q.front(); q.pop();
int u = t.v;
int sta = t.x;
vis[u][sta] = false; if(key[u]) sta |= key[u];
for(int i = ; i < ; i++) {
int x = (u+m-)/m + dx[i];
int y = (u%m?u%m:m) + dy[i]; if(x < || x > n || y < || y > m) continue;
int v = id[x][y];
//不是墙 并且 有对应钥匙 或者没有门。
if(mp[u][v]!= && ( (sta&(<<mp[u][v])) || mp[u][v]==-)) {
if(d[v][sta] > d[u][t.x] + ) {
d[v][sta] = d[u][t.x] + ;
if(!vis[v][sta]) {
vis[v][sta] = true;
q.push(qnode(v, sta));
}
}
}
}
}
int ans = INF;
for(int i = ; i < states; ++i) ans = min(ans, d[ed][i]);
if(ans == INF) puts("-1");
else printf("%d\n", ans);
}
int main() {
int i, j, k, x1, y1, x2, y2, q, sum;
scanf("%d%d%d", &n, &m, &p);//行,列,门和墙的总数 int cnt = ;
for(i = ; i <= n; ++i)
for(j = ; j <= m; ++j) id[i][j] = ++cnt; CLR(mp, -);
scanf("%d", &k);//门和墙总数
for(i = ; i <= k; ++i) {
scanf("%d%d%d%d%d", &x1, &y1, &x2, &y2, &q);
int id1 = id[x1][y1];
int id2 = id[x2][y2];
mp[id1][id2] = mp[id2][id1] = q;
}
scanf("%d", &sum);//钥匙总数
for(i = ; i <= sum; ++i) {
scanf("%d%d%d", &x1, &y1, &q);
key[id[x1][y1]] |= (<<q);
}
SPFA(, n*m);
return ;
}

洛谷 P4011 孤岛营救问题【最短路+分层图】的更多相关文章

  1. 洛谷 [P4011] 孤岛营救问题

    状压+BFS 通过观察数据范围可知,我们应该状压钥匙种类,直接BFS即可 注意,一个点处可能不知有一把钥匙 #include <iostream> #include <cstdio& ...

  2. 洛谷P4011 孤岛营救问题(状压+BFS)

    传送门 和网络流有半毛钱关系么…… 可以发现$n,m,p$都特别小,那么考虑状压,每一个状态表示位置以及钥匙的拥有情况,然后每次因为只能走一步,所以可以用bfs求出最优解 然后是某大佬说的注意点:每个 ...

  3. 洛谷 P4011 孤岛营救问题【bfs】

    注意: 一个点可能有多把钥匙,所以把每个点有钥匙的情况状压一下 两个点之间有障碍的情况只给出了单向,存的时候记得存一下反向 b[i][j]表示当前点拥有钥匙的状态,g[x1][y1][x2][y2]表 ...

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

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

  5. 洛谷P4011 【网络流24题】 孤岛营救问题 (BFS+状压)

    一道妙题啊......(不知道为什么这道题的标签是网络流,不需要用网络流啊) 如果没有门和钥匙,连边(边权为1)求最短路就行了. 但是有这两个因素的限制,我们采用分层建图的思想,一共2p层,每层对应持 ...

  6. Luogu P4011 孤岛营救问题

    题目链接 \(Click\) \(Here\) 注意坑点:一个地方可以有多把钥匙. 被卡了一会,调出来发现忘了取出来实际的数字,直接把二进制位或上去了\(TwT\),其他的就是套路的分层图最短路.不算 ...

  7. 洛谷P4009 汽车加油行驶问题(分层最短路)

    传送门 说好的网络流24题呢……上次是状压dp,这次怎么又最短路了…… 不过倒是用这题好好学了一下分层图最短路 把每一个位置$(x,y)$,油量剩余$k$表示为一个状态,然后转化成一个$n$进制数,这 ...

  8. BZOJ:2763-[JLOI2011]飞行路线(最短路分层图)

    题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=2763 解题心得: 第一次见到分层最短路.其实题中说选择k条路径免费,那怎么选k条路径并没 ...

  9. P4011 孤岛营救问题

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

随机推荐

  1. Java中反射和Unsafe破坏单例设计模式

    有如下单例模式设计代码: class Singleton { private String info = "HELLO SHIT"; private static Singleto ...

  2. Java学习--内置对象(其他的)

  3. zoj Calculate the Function

    Calculate the Function Time Limit: 2 Seconds      Memory Limit: 65536 KB You are given a list of num ...

  4. WinForm窗体多线程操作实例

    最近在学习C# 多线程相关知识,这块一直比较薄弱,在网上查了一下资料,学习了一下前辈们的经验,小弟自己也比葫芦画瓢的写了一个,自学一下. 代码如下 using System; using System ...

  5. css sprites的原理和作用

    CSS Sprites在国内很多人叫css精灵,是一种网页图片应用处理方式.它允许你将一个页面涉及到的所有零星图片都包含到一张大图中去,这样一来,当访问该页面时,载入的图片就不会像以前那样一幅一幅地慢 ...

  6. Angular面试题四

    二十.angular 的缺点有哪些? 1.强约束 导致学习成本较高,对前端不友好. 但遵守 AngularJS 的约定时,生产力会很高,对 Java 程序员友好. 2.不利于 SEO 因为所有内容都是 ...

  7. 2java.lang.NoClassDefFoundError异常

    1.错误信息 2.错误分析: JVM读到程序的第三行,会在当前路径 "D:\java" 下寻找com.yangquan.aolun这个包路径下的Cat类,但当前路径下根本就没有co ...

  8. web开发中的MVC框架与django框架的MTV模式

    1.MVC 有一种程序设计模式叫MVC,核心思想:分层,解耦,分离了 数据处理 和 界面显示 的代码,使得一方代码修改了不会影响到另外一方,提高了程序的可扩展性和可维护性. MVC的全拼为Model- ...

  9. zabbix使用问题

    1中文乱码 https://www.linuxidc.com/Linux/2017-08/146162.htm 软件 说明 备注 zabbix 3.4.7 操作系统 Centos7 问题描述:图表内容 ...

  10. 6.HTML速查模块

    1.HTML 基本文档 <!DOCTYPE html> <html> <head> <title>文档标题</title> </hea ...