題目:
給出乙個有向圖,走一條邊需要一些鑰匙,只有擁有這些鑰匙才可以走,走完後鑰匙不會消失。到達點可以獲得在這個點上的鑰匙。求從11到n
n的最短路。(邊權均為1)
終於找到一道spf
aspf
a的變形的題目了。。。
這道題在普通spf
aspf
a的基礎上增加了條件,如果能處理好這些條件,那麼就是乙個裸的spf
aspf
a。我們可以用狀態壓縮儲存每個點有的鑰匙和每條路需要的鑰匙,每條路需要的鑰匙可以直接在結構體裡面加上一維e[i
].ke
ye[i
].ke
y。然後再跑spf
aspf
a的時候,再加上乙個佇列key
numk
eynu
m,key
numk
eynu
m的每一位應該和q
q的每一位兩兩對應。key
numk
eynu
m儲存的是到達這個狀態的時候的鑰匙壓縮後的數字。
那麼當我們決定要走這條路的時候,除了spf
aspf
a本身的距離判斷,還要再加上乙個現在擁有的鑰匙是否可以走這條路的判斷。我們知道,如果可以走這條路,那麼就必須擁有開啟這條路的鑰匙,所以就有num
&;amp
;e[i
].ke
y=e[
i].k
eyeyn
um&a
mp;a
mp;e
[i].
key=
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 密室 最短路
題目 給出乙個有向圖,走一條邊需要一些鑰匙,只有擁有這些鑰匙才可以走,走完後鑰匙不會消失。到達點可以獲得在這個點上的鑰匙。求從1 11到n nn的最短路。邊權均為1 終於找到一道spf aspfa spfa 的變形的題目了。這道題在普通spf aspfa spfa 的基礎上增加了條件,如果能處理好這...
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和標記點的乙個有向圖,圖的每條邊是...