luogu4011 孤岛营救问题 分层图
关键词:分层图 状态压缩 最短路径
分层图:现在要求从起点到终点的最优路线,但受到手里拿着哪些钥匙的影响,最优路线不单纯了。因此,决定一个节点、一条边的存在的数中应当增加一个手中拿有钥匙的状态。这样就相当于把一张图按拿有钥匙的状态数分出了很多层。
状态压缩:手中拿有钥匙的状态可以压缩到一个整数中。
最短路径:手中拿有钥匙的状态固定了,在分层图中我们就不再用得着走回头路了。这样就转化成了最短路径问题。
#include <cstdio>
#include <cassert>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std; const int MAX_X = , MAX_Y = , MAX_KEY = , MAX_S = << , INF = 0x3f3f3f3f;
int Dist[MAX_X][MAX_Y][MAX_S];
int Key[MAX_X][MAX_Y];
int Gate[MAX_X][MAX_Y][MAX_X][MAX_Y];
int TotX, TotY;
const int xNext[] = { ,-,,, }, yNext[] = { , ,,-, }; struct Queue
{
int xs[MAX_X*MAX_Y*MAX_S], ys[MAX_X*MAX_Y*MAX_S], ss[MAX_X*MAX_Y*MAX_S];
int head, tail;
Queue() { head = tail = ; }
void push(int x, int y, int s) { xs[tail] = x; ys[tail] = y; ss[tail] = s; tail++; }
void pop() { head++; }
bool empty() { return head == tail; }
int frontX() { return xs[head]; }
int frontY() { return ys[head]; }
int frontS() { return ss[head]; }
}; int Bfs()
{
int ans = INF;
static Queue q;
Dist[][][Key[][]] = ;
q.push(, , Key[][]);
while (!q.empty())
{
int x = q.frontX(), y = q.frontY(), s = q.frontS();
q.pop();
Dist[x][y][s | Key[x][y]] = Dist[x][y][s];
s |= Key[x][y];
for (int p = ; p <= ; p++)
{
int x2 = x + xNext[p], y2 = y + yNext[p];
if (x2 >= && x2 <= TotX && y2 >= && y2 <= TotY &&
Dist[x2][y2][s]==INF &&
(Gate[x][y][x2][y2] == - || s&( << Gate[x][y][x2][y2])))
{
Dist[x2][y2][s] = Dist[x][y][s] + ;
q.push(x2, y2, s);
if (x2 == TotX&&y2 == TotY)
ans = min(ans, Dist[x2][y2][s]);
}
}
}
return ans;
} int main()
{
#ifdef _DEBUG
freopen("c:\\noi\\source\\input.txt", "r", stdin);
#endif
int totObs, totKeySort, x1, x2, y1, y2, gate, totKey, key;
memset(Gate, -, sizeof(Gate));
memset(Dist, INF, sizeof(Dist));
scanf("%d%d%d%d", &TotX, &TotY, &totKeySort, &totObs);
while (totObs--)
{
scanf("%d%d%d%d%d", &x1, &y1, &x2, &y2, &gate);
Gate[x1][y1][x2][y2] = Gate[x2][y2][x1][y1] = gate;
}
scanf("%d", &totKey);
while (totKey--)
{
scanf("%d%d%d", &x1, &y1, &key);
if (key >= )
printf("error\n");
Key[x1][y1] |= << key;
}
int ans = Bfs();
if (ans == INF)
printf("-1\n");
else
printf("%d\n", ans);
return ;
}
luogu4011 孤岛营救问题 分层图的更多相关文章
- 【网络流24题】 No.14 孤岛营救问题 (分层图最短路)
[题意] 1944 年,特种兵麦克接到国防部的命令,要求立即赶赴太平洋上的一个孤岛, 营救被敌军俘虏的大兵瑞恩. 瑞恩被关押在一个迷宫里, 迷宫地形复杂, 但幸好麦克得到了迷宫的地形图. 迷宫的外形是 ...
- 洛谷 P4011 孤岛营救问题【最短路+分层图】
题外话:昨夜脑子昏沉,今早一调试就过了...错误有:我忘记还有墙直接穿墙过...memset初始化INF用错了数...然后手残敲错一个状态一直过不了样例...要是这状态去比赛我简直完了......or ...
- [CODEVS1911] 孤岛营救问题(分层图最短路)
传送门 吐槽:神tm网络流... 用持有的钥匙分层,状态压缩,用 2 进制表示持有的钥匙集合. dis[i][j][k] 表示持有的钥匙集合为 k,到达点 (i, j) 的最短路径. 分层图的最短路听 ...
- [CTSC 1999]拯救大兵瑞恩&[网络流24题]孤岛营救问题
Description $1944$ 年,特种兵麦克接到国防部的命令,要求立即赶赴太平洋上的一个孤岛,营救被敌军俘虏的大兵瑞恩.瑞恩被关押在一个迷宫里,迷宫地形复杂,但幸好麦克得到了迷宫的地形图.迷宫 ...
- 「LOJ#6121」「网络流 24 题」孤岛营救问题(BFS
题目描述 1944 年,特种兵麦克接到国防部的命令,要求立即赶赴太平洋上的一个孤岛,营救被敌军俘虏的大兵瑞恩.瑞恩被关押在一个迷宫里,迷宫地形复杂,但幸好麦克得到了迷宫的地形图.迷宫的外形是一个长方形 ...
- Luogu P4011 孤岛营救问题(状态压缩+最短路)
P4011 孤岛营救问题 题意 题目描述 \(1944\)年,特种兵麦克接到国防部的命令,要求立即赶赴太平洋上的一个孤岛,营救被敌军俘虏的大兵瑞恩.瑞恩被关押在一个迷宫里,迷宫地形复杂,但幸好麦克得到 ...
- 【BZOJ-3627】路径规划 分层图 + Dijkstra + spfa
3627: [JLOI2014]路径规划 Time Limit: 30 Sec Memory Limit: 128 MBSubmit: 186 Solved: 70[Submit][Status] ...
- ACdream 1017 [分层图][网络流]
/* 大连热身C题 不要低头,不要放弃,不要气馁,不要慌张 题意: 给一个城市路线图,给定起点给定终点.有n个货物从起点运送到终点.城市的边是无向边. 每个货物每天如果通过某条路,那么这天这条路只能运 ...
- poj3635Full Tank?[分层图最短路]
Full Tank? Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 7248 Accepted: 2338 Descri ...
随机推荐
- vue-router简单用法
路由,其实就是指向的意思,当我点击页面上的home按钮时,页面中就要显示home的内容,如果点击页面上的about 按钮,页面中就要显示about 的内容.Home按钮 => home 内容, ...
- DeltaFish 校园物资共享平台 第五次小组会议
软工第五次小组会议 记录人:娄雨禛 会议地点:三教讨论区 会议时间:9:00-10:00 与会人员:软工小组成员 一.前端会议提要 前端分为“2+2”组合进行开发. 底层设计:齐天扬,刘鼎乾 界面美化 ...
- 【SQL】联合语句
一.UNION操作符 UNION 操作符用于合并两个结果集,在合并的同时去掉重复行,并按合并后结果的第一列升序排列.合并后结果集的列名由第一个结果集的列名确定. UINON连接的两个结果集必须具有相同 ...
- 08--C++拷贝构造函数详解
C++拷贝构造函数详解 一. 什么是拷贝构造函数 首先对于普通类型的对象来说,它们之间的复制是很简单的,例如: [c-sharp] view plain copy int a = 100; int b ...
- 【sqli-labs】 less24 POST- Second Order Injections *Real treat* -Stored Injections (POST型二阶注入 *真的好玩?* 存储注入)
简单登陆浏览一遍后,发现是一个登陆注册修改密码的应用 审查一下代码 登陆页面的username,password使用了转义 注册页面的参数也进行了转义处理 但是在修改password的页面,直接从se ...
- Django 框架入门
1.创建虚拟环境.(如果你想在你的服务器中运行多个项目,那么装虚拟环境是最好的选择) pip install virtualenv pip install virtualenvwrapper 安装好后 ...
- proc程序中使用PLSQL、Exception 、 动态SQL(day08)
. proc中如何使用plsql 1.1 使用plsql的语法 exec sql execute begin /* 相当于plsql的匿名块 */ end; end-exec; 在预编译时,需要加如下 ...
- CentOS7 笔记 (一) .NETCore
安装系统CentOS,虚拟机好麻烦,直接在阿里云开了一个6个月免费的ECS. 熟悉Linux 基本命令 登录,exit,vi ,vim,vi保存关闭,w,ls,mkdir,df,ip addr,修改系 ...
- 46.object类型
主要知识点 1.field分类 2.object field类型的存储 一.field类型分类 1.multivalue field { "tags": [ "tag1& ...
- 29.es路由原理
主要知识点 1.document路由到shard的理解及原理 2.路由算法:shard = hash(routing) % number_of_primary_shards 3.routing值(_i ...