狀態壓縮DP 旅行商問題

2021-08-21 20:26:24 字數 764 閱讀 2784

題目描述:給定乙個n個頂點組成的帶權有向圖的距離矩陣d( i , j ) ( inf表示沒有邊 )。要求從頂點0出發,經過每個頂點恰好一次後再回到頂點0.問所經過的邊的總權重的最小值是多少?

限制條件:

題目解析:

這個問題就是著名的旅行商問題(tsp)。所有可能的路線有(n-1)!種。這是乙個非常大的值,即使題中n已經很小了,仍然無法試遍每一種情況。對於這個問題,我們可以使用dp來解決,首先寫出它的遞推公式。

假設現在已經訪問過的頂點集合(起點0當作還未訪問過的頂點)為s,當前所在的頂點為v,用dp[s][v]表示從v出發訪問剩餘的所有頂點,最終回到頂點0的路徑的權重總和最小值。由於從v出發可以移動到任意乙個節點u不屬於s。因此有如下遞推公式:

由於在這個遞推公式中,有乙個下標是集合而不是普通的整數,因此需要稍加處理。我們可以把它編碼成乙個整數,或者給它定義乙個全序關係並用二叉搜尋樹儲存,從而可以使用記憶話搜尋來求解,特別的,對於集合我們可以把沒乙個元素的選取與否對應到乙個二進位制位裡,從而把狀態壓縮成乙個整數,大大方便了計算與維護。

**例項:

int n;

int d[max_n][max_n];

int dp[1 << max_n][max_n];

int rec(int s,int v)

return dp[s][v] = res;

}

旅行商問題 狀態壓縮

二進位制的很多應用離不開集合這個概念,我們都知道在計算機當中,所有資料都是以二進位制的形式儲存的。一般乙個int整形是4個位元組,也就是32位bit,我們通過這32位bit上0和1的組合可以表示多大21億個不同的數。如果我們把這32位bit看成是乙個集合,那麼每乙個數都應該對應集合的一種狀態,並且每...

從旅行商問題談狀態壓縮DP

乙個商品推銷員要去若干個城市推銷商品,該推銷員從乙個城市出發,需要經過所有城市後,回到出發地。應如何選擇行進路線,以使總的行程最短?請輸出最短行程。節點個數 n 滿足 2 leq n leq 20 路的長度小於 1000 例如這個旅行商問題,可能的路線一共有 n 1 種,如果純暴力試遍每一種方案,那...

POJ 3311 旅行商問題 狀態壓縮 dp

最近做 dp 做的起勁啊。旅行商問題的狀態壓縮 dp i j 表示 遍歷 i 中所有城市一遍 並且現在在 j 的最短距離是多少。第乙個點可以遍歷兩次所以先不設定為1,並且這個狀態是合法狀態,這個點曾經是最困擾我的。include include include include include inc...