洛谷 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.pswp.cn/news/250300.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/250300.shtml
英文地址,請注明出處:http://en.pswp.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(重繪): 根據渲染樹和幾何信息…