Luogu P4011 孤岛营救问题
注意坑点:一个地方可以有多把钥匙。
被卡了一会,调出来发现忘了取出来实际的数字,直接把二进制位或上去了\(TwT\),其他的就是套路的分层图最短路。不算太难。
#include <bits/stdc++.h>
using namespace std;
int n, m, p, k, s;
int can[11][11][11][11], key[11];
int mv[4][2] = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}};
int node (int x, int y, int f) {
return f * n * m + (x - 1) * m + y;
}
bool in_map (int x, int y) {
return 1 <= x && x <= n && 1 <= y && y <= m;
}
const int N = 1000010;
const int M = 4000010;
int cnt, head[N];
const int INF = 0x3f3f3f3f;
struct edge {
int nxt, to, w;
edge (int _nxt = 0, int _to = 0, int _w = 0) {
nxt = _nxt, to = _to, w = _w;
}
}e[M];
void add_edge (int u, int v, int w) {
e[++cnt] = edge (head[u], v, w); head[u] = cnt;
}
queue <int> q;
int vis[N], dis[N];
int spfa (int s, int t) {
memset (dis, 0x3f, sizeof (dis));
vis[s] = true; dis[s] = 0; q.push (s);
while (!q.empty ()) {
int u = q.front (); q.pop ();
for (int i = head[u]; i; i = e[i].nxt) {
int v = e[i].to;
if (dis[v] > dis[u] + e[i].w) {
dis[v] = dis[u] + e[i].w;
if (!vis[v]) {
vis[v] = true;
q.push (v);
}
}
}
vis[u] = false;
}
return dis[t] == INF ? -1 : dis[t];
}
vector <int> have[11][11];
int main () {
cin >> n >> m >> p >> k;
for (int i = 1; i <= k; ++i) {
static int x1, x2, y1, y2, g;
cin >> x1 >> y1 >> x2 >> y2 >> g;
if (g == 0) {
can[x1][y1][x2][y2] = -1;
can[x2][y2][x1][y1] = -1;
} else {
can[x1][y1][x2][y2] = g;
can[x2][y2][x1][y1] = g;
}
}
cin >> s;
for (int i = 1; i <= s; ++i) {
static int x, y, g;
cin >> x >> y >> g;
have[x][y].push_back (g);
}
int s = node (n, m, (1 << p)) + 1;
int t = node (n, m, (1 << p)) + 2;
for (int i = 0; i < (1 << p); ++i) {
memset (key, 0, sizeof (key));
for (int t = i, wei = 1; t != 0; t >>= 1, ++wei) {
key[wei] = t & 1;
}
for (int x = 1; x <= n; ++x) {
for (int y = 1; y <= m; ++y) {
for (int t = 0; t < 4; ++t) {
int tx = x + mv[t][0];
int ty = y + mv[t][1];
if (!in_map (tx, ty)) continue;
if (can[x][y][tx][ty] == 0 || (can[x][y][tx][ty] > 0 && key[can[x][y][tx][ty]] != 0)) {
// 没有门 / 有钥匙
// if (can[x][y][tx][ty] != 0) printf ("node (%d, %d, %d) -> node (%d, %d, %d)\n", x, y, i, tx, ty, i);
add_edge (node (x, y, i), node (tx, ty, i), 1);
}
}
for (int t = 0; t < have[x][y].size (); ++t) {
if (!key[have[x][y][t]])
add_edge (node (x, y, i), node (x, y, (i | (1 << (have[x][y][t] - 1)))), 0);
}
}
}
add_edge (node (n, m, i), t, 0);
}
add_edge (s, node (1, 1, 0), 0);
cout << spfa (s, t) << endl;
}
Luogu P4011 孤岛营救问题的更多相关文章
- Luogu P4011 孤岛营救问题(状态压缩+最短路)
P4011 孤岛营救问题 题意 题目描述 \(1944\)年,特种兵麦克接到国防部的命令,要求立即赶赴太平洋上的一个孤岛,营救被敌军俘虏的大兵瑞恩.瑞恩被关押在一个迷宫里,迷宫地形复杂,但幸好麦克得到 ...
- 洛谷 P4011 孤岛营救问题【最短路+分层图】
题外话:昨夜脑子昏沉,今早一调试就过了...错误有:我忘记还有墙直接穿墙过...memset初始化INF用错了数...然后手残敲错一个状态一直过不了样例...要是这状态去比赛我简直完了......or ...
- P4011 孤岛营救问题
\(\color{#0066ff}{题目描述}\) 1944 年,特种兵麦克接到国防部的命令,要求立即赶赴太平洋上的一个孤岛,营救被敌军俘虏的大兵瑞恩.瑞恩被关押在一个迷宫里,迷宫地形复杂,但幸好麦克 ...
- 洛谷 [P4011] 孤岛营救问题
状压+BFS 通过观察数据范围可知,我们应该状压钥匙种类,直接BFS即可 注意,一个点处可能不知有一把钥匙 #include <iostream> #include <cstdio& ...
- 洛谷P4011 孤岛营救问题(状压+BFS)
传送门 和网络流有半毛钱关系么…… 可以发现$n,m,p$都特别小,那么考虑状压,每一个状态表示位置以及钥匙的拥有情况,然后每次因为只能走一步,所以可以用bfs求出最优解 然后是某大佬说的注意点:每个 ...
- 洛谷 P4011 孤岛营救问题【bfs】
注意: 一个点可能有多把钥匙,所以把每个点有钥匙的情况状压一下 两个点之间有障碍的情况只给出了单向,存的时候记得存一下反向 b[i][j]表示当前点拥有钥匙的状态,g[x1][y1][x2][y2]表 ...
- 「LOJ#6121」「网络流 24 题」孤岛营救问题(BFS
题目描述 1944 年,特种兵麦克接到国防部的命令,要求立即赶赴太平洋上的一个孤岛,营救被敌军俘虏的大兵瑞恩.瑞恩被关押在一个迷宫里,迷宫地形复杂,但幸好麦克得到了迷宫的地形图.迷宫的外形是一个长方形 ...
- 孤岛营救问题(BFS+状压DP)
孤岛营救问题 https://www.luogu.org/problemnew/show/P4011 用状压DP标记拿到钥匙的数量 #include<iostream> #include& ...
- loj #6121. 「网络流 24 题」孤岛营救问题
#6121. 「网络流 24 题」孤岛营救问题 题目描述 1944 年,特种兵麦克接到国防部的命令,要求立即赶赴太平洋上的一个孤岛,营救被敌军俘虏的大兵瑞恩.瑞恩被关押在一个迷宫里,迷宫地形复杂, ...
随机推荐
- Java反射交换两个整型变量的值
在一次面试中,做了这么一道题"交换两个整型变量的值",当时看到这个题目之后,会心一笑,这也太简单了--直接使用中间变量交换不就可以了吗?但是,面试官却说不需要返回值,在调用的地方, ...
- 一、MyCat的搭建
一.什么是mycat 简单直接点就是,MyCat其实就是一个数据库的中间件!一般我们都是app直接到数据库!有了MyCat以后,就是app到MyCat然后再访问数据库. mycat是个中间件,它负责连 ...
- Sql Server 时间格式化
0 或 100 (*) 默认值 mon dd yyyy hh:miAM(或 PM) 1 101 美国 mm/dd/yyyy ...
- linux 目录分类与文件操作
/ 虚拟根目录 一般不会在这里存储文件 /bin 二进制目录,存放需要GNU用户级的工具 /boot 启动目录,存放启动文件 /dev 设备目录,linux在这里创建设备节点 /etc 系统配置文件目 ...
- IntelliJ IDEA通过Tomcat启动项目过程分析
Tomcat部署项目的多种方式 Tomcat安装目录:${TOMCAT_HOME} 1.常规的webapps下直接部署到${TOMCAT_HOME}/webapps下 2.利用控制台进行部署 3.外部 ...
- Luogu5289 十二省联考2019字符串问题(后缀数组+拓扑排序+线段树/主席树/KDTree)
先考虑80分做法,即满足A串长度均不小于B串,容易发现每个B串对应的所有A串在后缀数组上都是一段连续区间,线段树优化连边然后判环求最长链即可.场上就写了这个. 100分也没有什么本质区别,没有A串长度 ...
- BZOJ2554 color 【概率DP】【期望DP】
题目分析: 好题. 一开始看错题了,以为是随机选两个球,编号在前的染编号在后的. 但这样仍然能获得一些启发,不难想到可以确定一个颜色,剩下的颜色是什么就无关了. 那么答案就是每种颜色的概率乘以期望.概 ...
- Git Bash的妙用 - 使用Linux命令
如何在Windows中使用Linux命令? 网上有很多说是安装CygwinPortable 在cmd 窗口下是用linux 命令,但是还有一些缺陷. 其实对于程序员来说有一个非常简单有效的方法,那就是 ...
- requirements文件
将一个环境中安装的所有的包在另一个环境中安装 1.生成文件列表 pip freeze > requirements.txt 2.将该文件放入到新环境中,安装 pip install -r req ...
- MT【259】2016天津压轴题之最佳逼近
(2016天津压轴题)设函数$f(x)=(x-1)^3-ax-b,x\in R$, 其中$a,b\in R$(1)求$f(x)$的单调区间.(2)若$f(x)$存在极值点$x_0$,且$f(x_1)= ...