传送门

吐槽:神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 ;
}

[CODEVS1911] 孤岛营救问题(分层图最短路)的更多相关文章

  1. luogu4011 孤岛营救问题 分层图

    关键词:分层图 状态压缩 最短路径 分层图:现在要求从起点到终点的最优路线,但受到手里拿着哪些钥匙的影响,最优路线不单纯了.因此,决定一个节点.一条边的存在的数中应当增加一个手中拿有钥匙的状态.这样就 ...

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

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

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

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

  4. HDU 5669 线段树优化建图+分层图最短路

    用线段树维护建图,即把用线段树把每个区间都标号了,Tree1中子节点有到达父节点的单向边,Tree2中父节点有到达子节点的单向边. 每次将源插入Tree1,汇插入Tree2,中间用临时节点相连.那么T ...

  5. BZOJ 2763 分层图最短路

    突然发现我不会分层图最短路,写一发. 就是同层中用双向边相连,用单向边连下一层 #include <cstdio> #include <algorithm> #include ...

  6. 【网络流24题】 No.15 汽车加油行驶问题 (分层图最短路i)

    [题意] 问题描述:给定一个 N*N 的方形网格,设其左上角为起点◎, 坐标为( 1, 1), X 轴向右为正, Y轴向下为正, 每个方格边长为 1, 如图所示. 一辆汽车从起点◎出发驶向右下角终点▲ ...

  7. BZOJ_2662_[BeiJing wc2012]冻结_分层图最短路

    BZOJ_2662_[BeiJing wc2012]冻结_分层图最短路 Description “我要成为魔法少女!”     “那么,以灵魂为代价,你希望得到什么?” “我要将有关魔法和奇迹的一切, ...

  8. BZOJ_1579_[Usaco2009 Feb]Revamping Trails 道路升级_分层图最短路

    BZOJ_1579_[Usaco2009 Feb]Revamping Trails 道路升级_分层图最短路 Description 每天,农夫John需要经过一些道路去检查牛棚N里面的牛. 农场上有M ...

  9. Nowcoder contest 370H Rinne Loves Dynamic Graph【分层图最短路】

    <题目链接> 题目大意:Rinne 学到了一个新的奇妙的东西叫做动态图,这里的动态图的定义是边权可以随着操作而变动的图.当我们在这个图上经过一条边的时候,这个图上所有边的边权都会发生变动. ...

  10. ACM-ICPC 2018 南京赛区网络预赛 L 【分层图最短路】

    <题目链接> 题目大意: 有N个城市,这些城市之间有M条有向边,每条边有权值,能够选择K条边 边权置为0,求1到N的最短距离. 解题分析: 分层图最短路模板题,将该图看成 K+1 层图,然 ...

随机推荐

  1. HDU 5091 Beam Cannon (扫描线思想)

    题意:移动一个矩形,使矩形内包含的点尽量多. 思路:把一个点拆成两个事件,一个进(权值为1)一个出(权值为-1),将所有点按照x排序,然后扫描,对于每个x,用一个滑窗计算一下最大值,再移动扫描线.树状 ...

  2. openstack nova fail to create vm

    2019-05-13 14:43:27.017 47547 ERROR nova.compute.manager [req-3f1af0ed-c342-4cf3-8e76-6963053a5227 8 ...

  3. DROP LANGUAGE - 删除一个过程语言

    SYNOPSIS DROP [ PROCEDURAL ] LANGUAGE name [ CASCADE | RESTRICT ] DESCRIPTION 描述 DROP LANGUAGE 将删除曾注 ...

  4. linux下libnet编程 亲自测试可用

    linux下libnet编程 亲自测试可用 亲自测试  如果build包的时候 只要把类型改了 就能改成相应的协议. 0x0800 ip 0x0806 arp 0x86DD    IPv6 0x86e ...

  5. nodejs 静态资源服务与接口代理跨域

    首先需要 npm install express 和 npm install request 代码如下: const express = require('express'); const path ...

  6. 为什么要在函数内部声明 var that = this 呢

    看一个例子 $('#conten').click(function(){ //this是被点击的#conten var that =this; $('.conten').each(function() ...

  7. mybatis枚举类型处理器

    1. 定义枚举值的接口 public abstract interface ValuedEnum { int getValue(); } 所有要被mybatis处理的枚举类继承该接口 2. 定义枚举类 ...

  8. verilog $fopen 函数的小缺陷

    system task $fopen 的argument 为1.文件名字(可以包含具体的文件路径但是注意用)2.打开方式比如"r"."w"."a&qu ...

  9. makedown语法

    文章转载至:https://blog.csdn.net/u014061630/article/details/81359144#1-%E5%BF%AB%E6%8D%B7%E9%94%AE 前言 写过博 ...

  10. hihocoder1175 拓扑排序2

    #1175 : 拓扑排序·二 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho所在学校的校园网被黑客入侵并投放了病毒.这事在校内BBS上立刻引起了大家的讨论 ...