最短Hamilton路徑

2022-08-20 07:06:15 字數 623 閱讀 7172

題目大意:給定一張n(n <= 20)個點的帶權無向圖,點從0~n - 1標號,求起點0到終點n - 1的最短hamilton路徑。hamilton路徑的定義是從0到n - 1不重不漏地經過每個點恰好一次。

分析:這個題最樸素的想法就是列舉n個點的全排列,但是時間複雜度實在太高了。如果我們用二進位制狀態壓縮來表示的話,就能夠大大縮小時間消耗。使用狀壓dp就可以很好的解決這個題。可以使用乙個n位二進位制數,若其第i位為1,則表示第i個點已被遍歷,否則則未經過。在任意時刻還需要直到當前所處的位置,因此我們可以使用dp[i][j]表示,i代表點被經過的狀態,j表示當前所在的點的位置,因此我們的最終目標就是dp[(1 << n) - 1][n - 1]。在任意時刻,都有狀態轉移方程dp[i][j] = min。

**:

#includeusing

namespace

std;

const

int maxn = 21

;int dp[1

void

solve() }}

}}

cout

<< dp[(1

<< n) - 1][n - 1] <}int

main()

最短Hamilton路徑

給定一張 n 個點的帶權無向圖,點從 0 n 1 標號,求起點 0 到終點 n 1 的最短hamilton路徑。hamilton路徑的定義是從 0 到 n 1 不重不漏地經過每個點恰好一次。輸入格式 第一行輸入整數n。接下來 n 行每行n個整數,其中第i行第j個整數表示點i到j的距離 記為a i,j...

最短Hamilton路徑

題目描述 給定一張 n n 20 個點的帶權無向圖,點從 0 n 1 標號,求起點 0 到終點 n 1 的最短hamilton路徑。hamilton路徑的定義是從 0 到 n 1 不重不漏地經過每個點恰好一次。輸入第一行乙個整數n。接下來n行每行n個整數,其中第i行第j個整數表示點i到j的距離 乙個...

最短Hamilton路徑

本題如果使用暴搜的話會超時。因為是無向圖,所以最終我們只關心不重不漏的一條路徑的長度,而不關心內部先走哪個點後走哪個點。所以,我們需要對每個點進行位置標記,當然可以開乙個visited陣列記錄,但為了操作簡便以及空間複雜度,使用二進位制位表示更為簡便。某一位為1表示對應的該點被訪問過。因此乙個二進位...