AcWing 91 最短Hamilton路徑

2021-10-25 17:14:36 字數 1125 閱讀 8272

狀壓dp 二進位制

給定一張 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

輸出樣例:

首先我們要思考如果讓這個np完全題目複雜度降低,那麼可以優先考慮到使用位運算,狀態壓縮等解決思路。

然後接著思考,我們可以發現,我們所需要的不是整個方案,而只是方案最優解,所以我們只需要記錄當前這個方案的最優解即可,那麼我們考慮的狀態,不久只有,在當前方案i中,目前抵達的點是j。

現在既然裝填已經確定好了當前點j,那麼這個j點是由哪乙個狀態移動而來的呢?我們可以選擇k,也就是說我們的狀態轉移方程可以為

f[i]

[j]=min(f[i]

[j],f[i^(1<][k]+weight[k]

[j]

以上轉移方程,weight陣列為權值 ,也就是weight[k][j]是k點到j點的權值 i^(1<#include

using

namespace std;

int n,f[

1<<20]

[21],i,j,k;

int weight[21]

[21];

intmain()

AcWing 91 最短Hamilton路徑

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

91 AcWing 最短Hamilton路徑

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

AcWing 1134 最短路計數

題目描述 給出乙個 n 個頂點 m 條邊的無向無權圖,頂點編號為 1 到 n。問從頂點 1 開始,到其他每個點的最短路有幾條。輸入格式 第一行包含 2 個正整數 n,m,為圖的頂點數與邊數。接下來 m 行,每行兩個正整數 x,y,表示有一條頂點 x 連向頂點 y 的邊,請注意可能有自環與重邊。輸出格...