洛谷 P4011 孤岛营救问题【最短路+分层图】

题外话:昨夜脑子昏沉,今早一调试就过了...错误有:我忘记还有墙直接穿墙过...memset初始化INF用错了数...然后手残敲错一个状态一直过不了样例...要是这状态去比赛我简直完了......orz

题目链接:https://www.luogu.org/problemnew/show/P4011

 


输入输出样例

输入样例#1:
4 4 9
9
1 2 1 3 2
1 2 2 2 0
2 1 2 2 0
2 1 3 1 0
2 3 3 3 0
2 4 3 4 1
3 2 3 3 0
3 3 4 3 0
4 3 4 4 0
2
2 1 2
4 2 1
输出样例#1:
14

 

题解:分层图最短路问题。最多就10类门,一看就是状态压缩最大空间 (1<<11)-1 ,很友好...d[i][sta]表示到点i,状态为sta的最短路长度(sta就是到i点前所持有的钥匙的状态)。

代码:

 1 #include <cstdio>
 2 #include <vector>
 3 #include <algorithm>
 4 #include <queue>
 5 #include <cstring>
 6 #define CLR(a, b) memset((a), (b), sizeof((a)))
 7 using namespace std;
 8 const int N = 110;
 9 const int states = 1<<11;
10 const int INF = 0x3f3f3f3f;
11 
12 int d[N][states], vis[N][states];
13 int id[N][N];
14 int key[N];     //key[i]:i点有哪些钥匙(状态)
15 int mp[N][N];   //mp[i][j]:i到j有哪类门
16 int dx[] = {1, 0, -1, 0};
17 int dy[] = {0, 1, 0, -1};
18 int n, m, p;
19 struct qnode{
20     int v;
21     int x;//状态
22     qnode(int _v=0,int _x=0):v(_v),x(_x){}
23 };
24 bool SPFA(int st, int ed) {
25     CLR(vis, 0);
26     CLR(d, INF);
27     d[st][0] = 0;
28     queue<qnode> q;
29     while(!q.empty()) q.pop();
30     q.push(qnode(st, 0));
31     while(!q.empty()) {
32         qnode t = q.front(); q.pop();
33         int u = t.v;
34         int sta = t.x;
35         vis[u][sta] = false;
36 
37         if(key[u]) sta |= key[u];
38         for(int i = 0; i < 4; i++) {
39             int x = (u+m-1)/m + dx[i];
40             int y = (u%m?u%m:m) + dy[i];
41 
42             if(x < 1 || x > n || y < 1 || y > m) continue;
43             int v = id[x][y];
44             //不是墙 并且 有对应钥匙 或者没有门。
45             if(mp[u][v]!=0 && ( (sta&(1<<mp[u][v])) || mp[u][v]==-1)) {
46                 if(d[v][sta] > d[u][t.x] + 1) {
47                     d[v][sta] = d[u][t.x] + 1;
48                     if(!vis[v][sta]) {
49                         vis[v][sta] = true;
50                         q.push(qnode(v, sta));
51                     }
52                 }
53             }
54         }
55     }
56     int ans = INF;
57     for(int i = 0; i < states; ++i) ans = min(ans, d[ed][i]);
58     if(ans == INF) puts("-1");
59     else printf("%d\n", ans);
60 }
61 int main() {
62     int i, j, k, x1, y1, x2, y2, q, sum;
63     scanf("%d%d%d", &n, &m, &p);//行,列,门和墙的总数
64 
65     int cnt = 0;
66     for(i = 1; i <= n; ++i)
67         for(j = 1; j <= m; ++j) id[i][j] = ++cnt;
68 
69     CLR(mp, -1);
70     scanf("%d", &k);//门和墙总数
71     for(i = 1; i <= k; ++i) {
72         scanf("%d%d%d%d%d", &x1, &y1, &x2, &y2, &q);
73         int id1 = id[x1][y1];
74         int id2 = id[x2][y2];
75         mp[id1][id2] = mp[id2][id1] = q;
76     }
77     scanf("%d", &sum);//钥匙总数
78     for(i = 1; i <= sum; ++i) {
79         scanf("%d%d%d", &x1, &y1, &q);
80         key[id[x1][y1]] |= (1<<q);
81     }
82     SPFA(1, n*m);
83     return 0;
84 }
View Code

 

转载于:https://www.cnblogs.com/GraceSkyer/p/9022978.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/250300.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

输出控制台信息到日志 并 通过cronolog对tomcat进行日志切分

windows下tomcat默认并不会把控制台输出的信息都记录进日志文件。但是在生产环境中&#xff0c;出现问题时&#xff0c;控制台的日志输出是无法查据的&#xff0c;因此需要将日志记录下来。 解决方法&#xff1a; 输出日志到文件 修改tomcat的bin目录下的startup.bat文件&#…

微信小程序 --- [笔记小结] 环境搭建,基础学习

说明 源代码拷贝源代码 git clone https://github.com/Lizhhhh/miniProgram.git进入目录cd miniProgram查看tag: git tag选择需要查看的知识点,如: git checkout 02_Text 学习的视频失效了…后续还会找资源学习… 小程序 地址 一种不需要下载安装即可使用的应用,它实现了应…

监听发现局域网dropbox客户端broadcast-dropbox-listener

监听发现局域网dropbox客户端broadcast-dropbox-listenerDropbox是一款网盘文件同步工具。为了实现局域网内同步&#xff0c;该工具会通过UDP 17500端口发送广播包。Nmap的broadcast-dropbox-listener脚本可以监听局域网内dropbox客户端发送的广播包&#xff0c;并显示客户端的…

tornada-数据库

数据库 torndb安装连接初始化执行语句 executeexecute_rowcount查询语句 getquery与Django框架相比&#xff0c;Tornado没有自带ORM&#xff0c;对于数据库需要自己去适配。我们使用MySQL数据库。 在Tornado3.0版本以前提供tornado.database模块用来操作MySQL数据库&#xff0c…

使用Puppeteer进行数据抓取(一)——安装和使用

Puppeteer 是 Google Chrome 团队官方的Chrome 自动化工具。它本身是基于Chrome Dev Protocol协议实现的&#xff0c;但它提供了更高层次API封装&#xff0c;使用起来更加方便快捷。加上google这个大咖加官方的背景&#xff0c;更使得其地位更是提升了不少。 我之前在文章使用C…

读书笔记 --- [基础知识点] 小结1

1. TCP,UDP区别 TCPUDP基于有连接基于无连接对系统资源要求较多对系统资源要求少程序比较复杂程序结构比较简单流模式数据报模式保证数据的准确性不保证数据的准确性保证数据的顺序不保证数据的顺序 2. OSI七层模型以及tcp/ip四层模型 OSI七层模型tcp/ip四层模型常用的5层模型…

连读

一、辅音元音的连读 单词的音标以辅音结尾&#xff0c;下一个单词以元音开头。 1、/n/ /ə/ 连读后就饿会发出“呢” 这个音&#xff1b; 2、/v/ /ə/ son of a bitch 3、/t/ // 4、/t/ /ɔ:/ 差不多是 tall 这个音 not at all 5、/l/ /ɪ/ call it a day // 今天就到…

读书笔记 --- [基础知识点] 小结2

1. TCP和UDP的区别 \TCPUDP是否连接面向连接无连接是否可靠可靠不可靠连接对象个数1对11对1 或1 对多传输方式面向字节面向报文首部开销20字节8字节使用场景可靠传输,如: 文件传输实时应用(IP电话、视频会议、直播等) 2. WebSocket (1)什么是WebSocket? WebSocket是HTML5中的…

Spring差缺补漏

Spring差缺补漏 Spring4.0新特性 1&#xff1a;全面支持java1.8 2&#xff1a;空指针 RequestMapping("/user") public User getUser(String id,Option<String> userName){} 3&#xff1a;泛型依赖注入 public abstract class BaseService<M extends Serial…

tar压缩/解压用法

格式&#xff1a;tar zcvf 压缩后的路径及包名 你要压缩的文件 z:gzip压缩 c:创建压缩包 v:显示打包压缩解压过程 f:接着压缩 t:查看压缩包内容 x:解压 X:指定文件列表形式排除不需要打包压缩的文件或目录 -exclude:指定排除文件或目录不需要打包压缩的文件或目录&#xff08;也…

读书笔记 --- [基础知识点] 小结3

1. cookie与session的区别 参考 cookie机制 Cookie是服务器在本地机器上存储的小段文本,并随每一次发送至同一个服务器。网络服务器用HTTP头向客户端发送cookies,在客户端中,浏览器解析这些cookies并将它们保存为一个本地文件,它会自动将同一服务器的任何请求束缚上这些cook…

SPI接口比IIC速度快的理解

http://bbs.21ic.com/icview-279512-1-1.html I2C 的长处是超级低廉&#xff0c;而且是协议简单的总线。spi是端口&#xff0c;不是总线。 USB协议复杂。I2C因为跨电平的标准&#xff0c;所以是OC 上拉的&#xff0c;上拉高电平驱动能力很弱&#xff0c;所以决定了他跑不快。但…

运维基础测试题

运维基础测试题 一、选择题 1、管道符 ”|” 的作用是 A 将前一个命令的标准输入作为后一个命令的标准输出 B 将前一个命令的标准输出作为后一个命令的标准输入 2、终止一个后台进程需要用到哪个命令 A cp B kill C ctrlc D mv 3.Linux查看文件的命令&#xff0c;若希望…

解决phpmyadmin 遇见的问题

1、phpmyadmin4.8.3 上传到网站目录后提示解决phpmyadmin mysqli_real_connect(): (HY000/2002): No such file or directory的错误&#xff0c; 解决方法把phpmyadmin目录中的配置文件config.sample.inc.php改成config.inc.php&#xff0c;并把 $cfg[Servers][$i][host] loc…

javascript --- 对象属性的深层次获取

现有对象如下 let obj {a: {b:{c:{d:Marron}}} }想通过一个方法,输入该对象和路径a.b.c.d获取Marron的值 【思路】: 首先使用split数据,将a.b.c.d变为[a, b, c, d]然后使用shift()方法每次取出最前面的属性名,存放在prop中新建一个res对象,让res res[prop] 现假设有一函数…

浅谈mysql

因为本地mysql服务的命名是mysql57&#xff0c;所以在终端启动和关闭mysql的时候&#xff0c;我们这么写&#xff0c; net stop mysql57 ;net start mysql57;如图所示 接着输入mysql -u -root -p&#xff1b; 然后输入自己的密码&#xff1b; 查看有多少个库 show database…

HTTP --- HTTP2小结

参考 HTTP发展史 HTTP/0.9 - 单行协议 问世于1990年,那时的HTTP非常简单: 只支持GET方法; 没有首部; 只能获取纯文本 HTTP/1.0 - 搭建协议的框架 1996年,HTTP正式被作为标准公布,版本为HTTP/1.0。1.0版本增加了首部、状态码、权限、缓存、长连接(默认短连接)等规范,可以说搭建…

藤条生长为字母的动画

https://www.youtube.com/watch?vLshPEGiHsqc Blender Tutorial: Vine Animation Text 需要使用插件Add Curve: IvyGen, 进入用户设置,找到并沟选该插件. 建模:立体文字, [Alt C] 转换为网格mesh;选中网格文字,新建藤蔓:[Shift A], Curve\Add Ivy to Mesh左边工具栏下方的IvyG…

RDS Mysql中binlog日志查看

1、在阿里云下载下载的binlog 文件 如&#xff1a;mysql-bin.000217 2、想在本机解析出来&#xff0c;在本机安装mysql5.7版本&#xff08;注意系统版本要比RDS mysql 版本高才行&#xff09; 3、 cmd进入本机mysql\bin目录 e: cd E:\mysql5.7\bin mysqlbinlog -vv --base64-o…

读书笔记 --- 再次阅读回流与重绘

参考 - 强烈推荐看看,这个作者写了很多特别好的文章. 浏览器渲染过程 解析HTML,生成DOM树; 解析CSS生成CSSOM树将DOM树和CSSOM树合并,生成渲染(Render)树Layout(回流): 根据生成的渲染树,视口(viewport),得到节点的几何信息(位置、大小)Painting(重绘): 根据渲染树和几何信息…