JZOJ 5459 密室 最短路

2021-08-28 03:37:22 字數 1847 閱讀 6125

題目:

給出乙個有向圖,走一條邊需要一些鑰匙,只有擁有這些鑰匙才可以走,走完後鑰匙不會消失。到達點可以獲得在這個點上的鑰匙。求從1

11到n

nn的最短路。(邊權均為1)

終於找到一道spf

aspfa

spfa

的變形的題目了。。。

這道題在普通spf

aspfa

spfa

的基礎上增加了條件,如果能處理好這些條件,那麼就是乙個裸的spf

aspfa

spfa

。我們可以用狀態壓縮儲存每個點有的鑰匙和每條路需要的鑰匙,每條路需要的鑰匙可以直接在結構體裡面加上一維e[i

].ke

ye[i].key

e[i].k

ey。然後再跑spf

aspfa

spfa

的時候,再加上乙個佇列key

nu

mkeynum

keynum

,k ey

nu

mkeynum

keynum

的每一位應該和q

qq的每一位兩兩對應。key

nu

mkeynum

keynum

儲存的是到達這個狀態的時候的鑰匙壓縮後的數字

那麼當我們決定要走這條路的時候,除了spf

aspfa

spfa

本身的距離判斷,還要再加上乙個現在擁有的鑰匙是否可以走這條路的判斷。我們知道,如果可以走這條路,那麼就必須擁有開啟這條路的鑰匙,所以就有num

&

;amp

;e[i

].ke

y=e[

i].k

ey

num\&e[i].key=e[i].k ey

num&am

p;am

p;e[

i].k

ey=e

[i].

key。

最後列舉到達終點時的鑰匙,並輸出最小值即可。

#include

#include

#include

#include

#define n 6100

#define inf 1e9

using

namespace std;

int n,m,k,tot,key[n]

,head[n]

,dis[n]

[1024

],x,y,z;

bool vis[n]

[1024];

struct edge

e[n]

;void

add(

int from,

int to,

int num)

void

spfa()

}}}}

intmain()

for(

int i=

1;i<=m;i++

)add

(x,y,num);}

spfa()

;int ans=inf;

for(

int i=

0;i<=

1023

;i++

) ans=

min(ans,dis[n]

[i]);if

(ansprintf

("%d\n"

,ans)

;else

printf

("no solution");

return0;

}

JZOJ 5459 密室 最短路

題目 給出乙個有向圖,走一條邊需要一些鑰匙,只有擁有這些鑰匙才可以走,走完後鑰匙不會消失。到達點可以獲得在這個點上的鑰匙。求從11到n n的最短路。邊權均為1 終於找到一道spf aspf a的變形的題目了。這道題在普通spf aspf a的基礎上增加了條件,如果能處理好這些條件,那麼就是乙個裸的s...

JZOJ 3470 最短路 最短路 DFS

給定乙個n nn個點m mm條邊的有向圖,有k kk個標記點,要求從規定的起點按任意順序經過所有標記點到達規定的終點,問最短的距離是多少。最短路 dfs 首先,對於每乙個標記點和s ss點,以它們為起點跑一邊spfa,由於k 10 k leq10 k 10 所以我們就可以得到乙個只有s ss和標記點...

JZOJ 3470 最短路 最短路 DFS

給定乙個n n個點m m條邊的有向圖,有k k個標記點,要求從規定的起點按任意順序經過所有標記點到達規定的終點,問最短的距離是多少。最短路 dfs 首先,對於每乙個標記點和s s點,以它們為起點跑一邊spfa,由於k 10 k 10 所以我們就可以得到乙個只有s s和標記點的乙個有向圖,圖的每條邊是...