題目:
給出乙個有向圖,走一條邊需要一些鑰匙,只有擁有這些鑰匙才可以走,走完後鑰匙不會消失。到達點可以獲得在這個點上的鑰匙。求從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和標記點的乙個有向圖,圖的每條邊是...