題意:從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 include include include include include include include include include include define ll int64 define lll unsigned long long define max 1000009 defin... 題意 有 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... 題目大意 類似於tsp問題,只是每個點可以走多次,比經典tsp問題不同的是要先用弗洛伊的預處理一下兩兩之間的距離。求最短距離。解析 可以用全排列做,求出乙個最短的距離即可。或者用狀態壓縮dp.用乙個二進位制數表示城市是否走過 狀態表示 dp state i 表示到達i點狀態為state的最短距離 狀...3311 POJ 狀態壓縮
POJ 3311 佛洛依德列舉
poj 3311 狀態壓縮dp