poj3311 TSP問題 狀壓DP

2021-07-04 22:57:34 字數 1046 閱讀 9351

題意:從0走遍1~n最後再返回到0,乙個點可以走多次,求經過的最短距離。

分析:由於乙個點可以走多次,所以需要求出任意兩點間的最短距離,就要用到floyd演算法,同時接下來可以搜尋做複雜度是o(n!),而狀態壓縮的時間效率就高了,關於dp自己有時候狀態轉移方程知道了,卻不知道如何去實現,迴圈時哪層放在外面,哪層放在裡面,所以很容易把dp寫成了暴力的搜尋,自己要多想想。

狀態轉移方程:dp[s][i] = min(dp[s^(1<<(i-1))][j] + dis[j][i],dp[s][i])

四不像的搜尋:

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

#define ll long long

const int maxn = (1<<10) + 5;

const int inf = 0x7f7f7f7f;

int g[15][15];

int n;

int mmin;

inline int getone(int x)

return res;

}void floyd()

}}void dfs(int u, int state, int cur)//寫搜尋本可以不用二進位制

for (int i = 1; i <= n; i++)

}}int main()

}}int main()

{ //freopen("input.txt", "r", stdin);

while (cin >> n && n)

{for (int i = 0; i <= n; i++)

for (int j = 0; j <= n; j++)cin >> g[i][j];

floyd();

for (int s = 1; s < (1

3311 POJ 狀態壓縮

include include include include include include include include include include define ll int64 define lll unsigned long long define max 1000009 defin...

POJ 3311 佛洛依德列舉

題意 有 n 個地點,之後告訴你n個地點的之間的距離,問從起點出發,經過所有的點後再回到起點,求最短路。輸入 3 0 1 10 10 1 0 1 2 10 1 0 10 10 2 10 0 0 輸出 8 分析 tsp 旅行商 問題,可以先求出任意兩點之間的最短路g i j 直接三重迴圈的floyed...

poj 3311 狀態壓縮dp

題目大意 類似於tsp問題,只是每個點可以走多次,比經典tsp問題不同的是要先用弗洛伊的預處理一下兩兩之間的距離。求最短距離。解析 可以用全排列做,求出乙個最短的距離即可。或者用狀態壓縮dp.用乙個二進位制數表示城市是否走過 狀態表示 dp state i 表示到達i點狀態為state的最短距離 狀...