給定一張 n 個點的帶權無向圖,點從 0~n-1 標號,求起點 0 到終點 n-1 的最短hamilton路徑。 hamilton路徑的定義是從 0 到 n-1 不重不漏地經過每個點恰好一次。
輸入格式
第一行輸入整數n。
接下來n行每行n個整數,其中第i行第j個整數表示點i到j的距離(記為a[i,j])。
對於任意的x,y,z,資料保證 a[x,x]=0,a[x,y]=a[y,x] 並且 a[x,y]+a[y,z]>=a[x,z]。
輸出格式
輸出乙個整數,表示最短hamilton路徑的長度。
資料範圍
1≤n≤20
0≤a[i,j]≤107
輸入樣例:
5
0 2 4 5 1
2 0 6 5 3
4 6 0 8 3
5 5 8 0 5
1 3 3 5 0
輸出樣例:18
狀壓dp經典題,詳見注注釋。
#include using namespace std;
int n, a[25][25], dp[1 << 20][20] = ;//dp[i][j]代表在狀態i下 當前處於j的最短路徑(j已經被訪問過了)
void hamilton()}}
} }}int main()
} hamilton();
cout << dp[(1 << n) - 1][n - 1];
}
最短Hamilton路徑 CH0103
給定一張n n 20 個點的帶權無向圖,點從0 n 1標號,求起點0到終點n 1的最短hamilton路徑。hamilton路徑定義為每個頂點正好經過一次的路徑。題解 列舉所有情況的時間複雜度是o n n 使用二進位制狀態壓縮dp可以優化到o n2 2n 用乙個陣列f i j 維護當i 0 i 2n...
最短Hamilton路徑 CH0103
題面描述 給定一張 n n 20 n n 20 n n 20 個點的帶權無向圖,點從 0 00 n 1 n 1n 1 標號,求起點 0 00 到終點 n 1 n 1n 1 的最短hamilton路徑。hamilton路徑的定義是從 0 00 到 n 1 n 1n 1 不重不漏地經過每個點恰好一次。思...
CH0103 最短Hamilton路徑 狀壓DP
狀壓dp,狀態 f i j f i j f i j 用 n nn 位二進位制數 i ii 來表示每個點是否被經過,同時 j jj 記錄當前路徑終點,每次列舉 j jj 的前乙個點,確定上一狀態,轉移即可,注意求最小值,先將 f ff 陣列置為正無窮,令 f 1 0 0 f 1 0 0 f 1 0 0...