传送门

吐槽:神tm网络流。。。

用持有的钥匙分层,状态压缩,用 2 进制表示持有的钥匙集合。

dis[i][j][k] 表示持有的钥匙集合为 k,到达点 (i, j) 的最短路径。

分层图的最短路听上去很玄乎,其实通过代码来看还是很好理解的。

——代码

 #include <queue>
#include <cstdio>
#include <cstring>
#include <iostream>
#define N 20
#define min(x, y) ((x) < (y) ? (x) : (y)) int n, m, p, ans = ~( << );
int map[N][N][N][N], key[N][N], dis[N][N][ << ];
int dx[] = {, , , -}, dy[] = {, , -, };
bool vis[N][N][ << ]; struct node
{
int x, y, s;
node(int x = , int y = , int s = ) : x(x), y(y), s(s) {}
}; std::queue <node> q; inline int read()
{
int x = , f = ;
char ch = getchar();
for(; !isdigit(ch); ch = getchar()) if(ch == '-') f = -;
for(; isdigit(ch); ch = getchar()) x = (x << ) + (x << ) + ch - '';
return x * f;
} inline bool Acc(int x1, int y1, int x2, int y2, int s)
{
int need_key = map[x1][y1][x2][y2];
if(!need_key) return ;
if(need_key == -) return ;
return (s >> need_key - ) & ;
} inline void spfa()
{
node now;
int i, s, x, y;
memset(dis, / , sizeof(dis));
dis[][][] = ;
q.push(node(, , ));
while(!q.empty())
{
now = q.front();
q.pop();
vis[now.x][now.y][now.s] = ;
for(i = ; i < ; i++)
{
x = now.x + dx[i];
y = now.y + dy[i];
s = now.s | key[x][y];
if(!x || x > n || !y || y > m) continue;
if(Acc(now.x, now.y, x, y, now.s))
if(dis[x][y][s] > dis[now.x][now.y][now.s] + )
{
dis[x][y][s] = dis[now.x][now.y][now.s] + ;
if(!vis[x][y][s])
{
vis[x][y][s] = ;
q.push(node(x, y, s));
}
}
}
}
} int main()
{
int i, j, a, b, c, d, x, y, z, doors, keys;
n = read();
m = read();
p = read();
doors = read();
memset(map, -, sizeof(map));
for(i = ; i <= doors; i++)
{
a = read();
b = read();
c = read();
d = read();
map[a][b][c][d] = map[c][d][a][b] = read();
}
keys = read();
for(i = ; i <= keys; i++)
{
x = read();
y = read();
z = read();
key[x][y] |= << z - ;
}
spfa();
for(i = ; i < ( << ); i++) ans = min(ans, dis[n][m][i]);
if(ans == ) ans = -;
printf("%d\n", ans);
return ;
}

最新文章

  1. Windows平台Go调用DLL的坑
  2. PL/SQL设置快捷键
  3. ubuntu15.10跑裸机程序跑.bin文件
  4. hdu&#160;1162&#160;Eddy&#39;s&#160;picture(最小生成树,基础)
  5. Android中的音频播放(MediaPlayer和SoundPool)
  6. NGUI自适应分辨率,黑边自动填充, 无黑边,等比例缩放
  7. 每隔一段时间执行一次函数。window.setTimeout
  8. Kaggle入门——使用scikit-learn解决DigitRecognition问题
  9. nodejs+express+mongoose无法获取数据库数据问题解决
  10. windows下安装Python2和Python3共存
  11. NLP+VS=&gt;Image Caption︱自动生成图像标题技术论文+相关项目
  12. 第一个Polymer应用 - (0)准备工作
  13. 开源一个IE下获取XPath小工具,支持32/64位
  14. 第53章 结束会话端点(End Session Endpoint) - Identity Server 4 中文文档(v1.0.0)
  15. BZOJ2738 矩阵乘法(整体二分+树状数组)
  16. Redis常见业务场景应用
  17. QtWebkit包含的类简介
  18. BUG记忆
  19. PPI协议(西门子PLCS7-200)
  20. Ext之grid內編輯

热门文章

  1. 字符串转换JSON 的方法
  2. [CV笔记]inRange对图像进行分割
  3. Problem D: 小平查密码
  4. 剑指offer22 栈的压入、弹出序列
  5. css3中的nth-child和nth-of-type的区别
  6. tensorflow目标检测API之建立自己的数据集
  7. [Codeforces Round #250]小朋友和二叉树
  8. mysql 备份 常用脚本
  9. php加密解密函数大全
  10. 【windows】【md5】查看文件的md5值