狀壓dp 旅行商問題

2021-09-12 06:16:04 字數 721 閱讀 5518

首先我們對於較小的節點數目可以根據二進位制去壓縮,比如說這裡的5個點,我們可以用(1<<5)-1 即(1 1 1 1 1)去表示每個點的狀態,如果訪問過用1 表示,沒有訪問則用0 表示,這道題是乙個狀壓dp的入門題,但是也是較為經典的乙個問題旅行商問題,我們通過判斷dp[s][v]的值的情況判斷v點是否訪問過,這裡就是用到了記憶化搜尋的思想,當dp[s][v]>0的時候,我們直接返回就可以,不用再次去遞迴計算

上**。。

#include using namespace std;

int m,n;

const int inf=1e9;

const int maxn=15;

int map[maxn][maxn];

int dp[1<=0) //s為狀態量 dp[s][v]>=0表示v點已經計算過了,如果直接返回結果

return dp[s][v];

if(s==(1<>u)&1)&&map[v][u]>=0) (s>>u)&1判斷s對應u位的狀態 map表示地圖

res=min(res,find(s|(1<>m>>n;

for(int i=0;i>u>>v>>w;

map[u][v]=w;

}cout<

}

狀壓DP《旅行商問題》

旅行社問題就是給乙個有向圖,從點0走一圈全部結點再走回來所花費的費用最少是多少。狀壓dp一般n 15。因為是走完全部點,那麼走到2點的費用有可能走了5,也可能沒走,那麼就不能簡單的用最短路來找。因為要求跑完全部點回到0,而最小樹形圖的話無法做到。狀壓dp是指在乙個點上存在多種狀態,這些狀態可以用二進...

狀壓dp POJ 3311 旅行商問題

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

旅行商問題

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