当前位置: 首页 > news >正文

Luogu P4011 孤岛营救问题

题目链接 \(Click\) \(Here\)

注意坑点:一个地方可以有多把钥匙。

被卡了一会,调出来发现忘了取出来实际的数字,直接把二进制位或上去了\(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;
} 

转载于:https://www.cnblogs.com/maomao9173/p/10537889.html

相关文章:

  • 程序员修仙之路--突破内存限制的高性能排序
  • eslint 规则资料汇总
  • Play Store发现SimBad恶意软件,1.5亿Android用户成受害者 ...
  • postman中参数设置描述
  • 一对一直播软件如何盈利?
  • 自定义PlantUML和C4Model的样式
  • Java Object类及其equals方法
  • C,java,Python,这些名字背后的江湖!
  • spring cloud微服务分布式云架构-单点登录(SSO)
  • 仓管云——企业云erp功能有哪些?
  • jvm在什么时候进行进行垃圾回收,在什么时候进行扩大内存
  • 第四周作业1
  • PowerShell Switch判断语句示例
  • Android ViewPager实现循环轮播图
  • 如何在 Kubernetes 中对无状态应用进行分批发布
  • 【402天】跃迁之路——程序员高效学习方法论探索系列(实验阶段159-2018.03.14)...
  • 【译】React性能工程(下) -- 深入研究React性能调试
  • 【跃迁之路】【585天】程序员高效学习方法论探索系列(实验阶段342-2018.09.13)...
  • create-react-app做的留言板
  • Java超时控制的实现
  • JS函数式编程 数组部分风格 ES6版
  • leetcode388. Longest Absolute File Path
  • nodejs实现webservice问题总结
  • php ci框架整合银盛支付
  • Redux系列x:源码分析
  • spring学习第二天
  • zookeeper系列(七)实战分布式命名服务
  • 官方解决所有 npm 全局安装权限问题
  • 好的网址,关于.net 4.0 ,vs 2010
  • 罗辑思维在全链路压测方面的实践和工作笔记
  • 手机app有了短信验证码还有没必要有图片验证码?
  • 责任链模式的两种实现
  • 自定义函数
  • 《TCP IP 详解卷1:协议》阅读笔记 - 第六章
  • python最赚钱的4个方向,你最心动的是哪个?
  • ​secrets --- 生成管理密码的安全随机数​
  • %3cli%3e连接html页面,html+canvas实现屏幕截取
  • (1)(1.11) SiK Radio v2(一)
  • (12)目标检测_SSD基于pytorch搭建代码
  • (二)正点原子I.MX6ULL u-boot移植
  • (分享)自己整理的一些简单awk实用语句
  • (十三)Java springcloud B2B2C o2o多用户商城 springcloud架构 - SSO单点登录之OAuth2.0 根据token获取用户信息(4)...
  • (学习日记)2024.03.12:UCOSIII第十四节:时基列表
  • .net core 6 redis操作类
  • .NET Core6.0 MVC+layui+SqlSugar 简单增删改查
  • .NET Core日志内容详解,详解不同日志级别的区别和有关日志记录的实用工具和第三方库详解与示例
  • .NET DataGridView数据绑定说明
  • .NET gRPC 和RESTful简单对比
  • .net 使用$.ajax实现从前台调用后台方法(包含静态方法和非静态方法调用)
  • .NET 中什么样的类是可使用 await 异步等待的?
  • @Transaction注解失效的几种场景(附有示例代码)
  • [20171101]rman to destination.txt
  • [20190401]关于semtimedop函数调用.txt
  • [2024] 十大免费电脑数据恢复软件——轻松恢复电脑上已删除文件
  • [ai笔记9] openAI Sora技术文档引用文献汇总