狀壓DP《旅行商問題》

2021-08-01 19:50:18 字數 1070 閱讀 3963

旅行社問題就是給乙個有向圖,從點0走一圈全部結點再走回來所花費的費用最少是多少。

狀壓dp一般n<=15。

因為是走完全部點,那麼走到2點的費用有可能走了5,也可能沒走,那麼就不能簡單的用最短路來找。

因為要求跑完全部點回到0,而最小樹形圖的話無法做到。

狀壓dp是指在乙個點上存在多種狀態,這些狀態可以用二進位制來進行表示。

因為是最後走到0的費用,那麼可以有這麼個公式dp[s][i]=min(dp[s][i],dp[s|1也就是走完這個集合且目前在v的最小費用,是走完

for(j=0;jdp[s][i]=min(dp[s][i],dp[s|1《相當於是從某個頂點退回來的最小費用,也就是這個dp是從終點逆著dp的。

那麼只要初始化dp[1《第一次迴圈就可以得到走完各個點差一步到0的最小費用,然後再向後dp,直到dp[0][0]

相當dfs的做法:

#include #include#include#include #include #include #include using namespace std;

struct ttt;

int dp[1<<17][16];

int map1[16][16];

int n;

int dfs(int s,int v)

cout << dfs(0,0) << endl;

return 0;

}

初始的時候,需要設定所有初始dp都是無窮大的

#include #include#include#include #include #include #include using namespace std;

struct ttt;

int dp[1<<17][16];

int map1[16][16];

int n;

int main()

int s;

for(s=(1<=0;s--)

for(i=0;i=0;s--)

for(i=0;i>j&1)==0) //s中無j

dp[s][i]=min(dp[s][i],dp[s|1<

狀壓dp 旅行商問題

首先我們對於較小的節點數目可以根據二進位制去壓縮,比如說這裡的5個點,我們可以用 1 5 1 即 1 1 1 1 1 去表示每個點的狀態,如果訪問過用1 表示,沒有訪問則用0 表示,這道題是乙個狀壓dp的入門題,但是也是較為經典的乙個問題旅行商問題,我們通過判斷dp s v 的值的情況判斷v點是否訪...

狀壓dp POJ 3311 旅行商問題

題目大意 poj這題是變形 乙個送外賣的人,要將外賣全部送去所有地點再回到店裡,求最短路。店在0點。因為這裡可以重複經過每個地點。所以首先用floyd求出最短路,然後再進行dp即可 我看題解基本上都是遞推dp,我寫的記憶化搜尋。因為沒有刪除別人的變數定義,導致陣列開小,又debug了2個小時。遞推的...

旅行商問題

旅行商問題 乙個商人從城市a出發,訪問bcde等城市各一次最後回到a,問行程如何使得路程或費用最低。這是個np 非多項式可解,但一般驗證容易 問題,假設中間有4個城市,那麼全排列為4!24種,沒有很好的演算法,基本只能窮舉了。class vertex 4 public class lianxi pu...