Hamilton哈密頓最短路徑 二進位制狀態壓縮

2021-10-22 21:19:52 字數 1659 閱讀 1050

哈密頓最短路徑即為從起點到終點,計算出經過圖中所有點的最短路徑。(點較少的情況)

由於途中點較少,可能會直接想到暴力列舉所有點的全排列,然後計算最短距離,其時間複雜度為 o(n

∗n!)

o(n * n !)

o(n∗n!

),但是如果使用動態規劃,列舉每個點被經過的狀態的話,那麼可以將時間複雜度降到 o(n

2∗2n

)o(n ^ 2 * 2 ^ n)

o(n2∗2

n).假設點a,那麼經過點a 的狀態只有經過和還沒有經過兩個狀態,所以這裡就可以用到二進位制狀態壓縮,將經過定義為1,沒經過定義為0。假設途中一共又n個點,那麼其狀態就可以用乙個長度為n的二進位制數表示。

我們在使用dp的時候,dp的初態就是在起點上的狀態,由於起點是被經過了的,所以現在的二進位制數為1, ,dp的終態就是在終點的時候,所有點都已經被經過了,所以其經過點的狀態就是由n個1組成的二進位制數,轉換為十進位制就為 (

1<

−1

(1 << n) - 1

(1<

−1。由於我們要知道的不是從起點到終點的最短路徑,而是經過所有點的最短路徑,所以我們要在dp的每乙個狀態下,計算出起點到當前經過點的最短路徑。

即:當遍歷到狀態 i(二

進製狀態

的十進位制

表示

)i (二進位制狀態的十進位制表示)

i(二進位制狀

態的十進

制表示)

時,在此狀態下點 j

jj 是被經歷過了的,那麼在這個狀態下,起點到 j

jj 點的距離在一定要計算出是最短的,怎麼計算出最短的呢,就是列舉所有點,作為中間點,將上乙個還未經過 j 點狀態下到被列舉點的最短距離,加上列舉點到j點的距離:

k為中間點,ixo

r(

1<

i ^ (1 << j)

ixor(1

<

動態方程:

d p[

i][j

]=mi

n(dp

[i][

j],d

p[ix

or(1

<

][k]

+wei

ght[

k][j

]dp[i][j] = min(dp[i][j], dp[i ^ (1 << j)][k] + weight[k][j]

dp[i][

j]=m

in(d

p[i]

[j],

dp[i

xor(

1<

][k]

+wei

ght[

k][j

]**模板示例:

memset

(dp, inf,

sizeof

(dp));

//初始化

dp[1][

0]=0

;//走了1個點時的第0個點的最短路

for(

int i =

1; i <

1<< n; i ++)}

}}cout << dp[(1

<< n)-1

][n -1]

<<

"\n"

;

最短哈密頓環 退火 退火演算法最短路徑

根據不同的具體要求可以是長度最短或行駛時間最短。由 於問題的特徵 網路特性等的紛繁複雜最短路徑演算法表現出多樣性。除了經典的方法外。近年來出現的模擬退火 在求 解此問題時,傳統的最短路徑演算法有dijkstra演算法,啟發性的 搜尋演算法有模擬退火演算法 遺傳演算法 蟻群演算法等。蟻群演算法是一種基...

最短哈密頓路徑(位運算 dp)

題意 求從點0到點n 1的最短哈密頓路徑,即0 n 1這n個點每個點必須且只能經過一次。起點為0,終點為n 1,問你最短路徑長度 題解 設f i j 表示從0開始,途中經過了i這個二進位制表示的數中位為1的所有點後,到達了j這個點的最短路徑 舉個例子i為111001110,那麼這時候第1,2,3和6...

最短哈密頓路徑 (狀壓DP

題意 給一副n個點的無向圖 完全圖 求從點0到n 1的最短哈密頓路徑 思路 狀壓dp入門題,這題的子問題其實是每個點的使用狀況,這種集合類的dp一般都是狀壓dp,所以我們用dp i j 表示當前在第i個點的時候,所有的點的使用狀況,先列舉狀態,然後列舉當前的點,再在剩下的點中列舉尚未使用過的點,複雜...