二進位制狀態壓縮解決哈密頓最短路徑問題

2021-10-08 15:50:57 字數 1027 閱讀 4527

右邊為第0位,左邊為第n-1位

1. 取出整數n在二進位制表示下的第k位	(n>>k)&1

1001

0100 取出第4位 0000

1001

&0000

0001

->

0000

0001

2. 取出整數n在二進位制表示下的第0

~k-1位(後k位) n&((

1<

)1001

0100 取出後5位 0010

0000-1

=0001

1111

3.把整數n在二進位制表示下的第k位取反

n xor(1

<

4.把整數n在二進位制表示下的第k位賦值1

n|(1<

5.把整數n在二進位制表示下的第k位賦值1

n&(~(

1<

)~為取反操作

#include

#include

#include

using

namespace std;

int weight[20]

[20];

//存邊

int f[

1<<20]

[20];

intmain()

}memset

(f,0x3f

,sizeof

(f))

;//初始化為無窮大

f[1]

[0]=

0;//i=1,表示目前只經過了i點,j=0,表示目前在0號節點

for(

int i=

1;i<

1<

)//列舉所有的狀態}}

} cout<

<

][n-1]

;//終點是n-1,且前n-1個頂點都經過了

return0;

}

最短哈密頓路徑 二進位制壓縮思想

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

Hamilton哈密頓最短路徑 二進位制狀態壓縮

哈密頓最短路徑即為從起點到終點,計算出經過圖中所有點的最短路徑。點較少的情況 由於途中點較少,可能會直接想到暴力列舉所有點的全排列,然後計算最短距離,其時間複雜度為 o n n o n n o n n 但是如果使用動態規劃,列舉每個點被經過的狀態的話,那麼可以將時間複雜度降到 o n 2 2n o ...

二進位制狀態壓縮

二進位制狀態壓縮,即將乙個長度為m的bool陣列用乙個m位的二進位制數來表示和儲存 操作運算 取出整數n在二進位制表示下的第k位 n k 1 取出整數n在二進位制表示下的第0 k 1位 後 k 位 n 1 取出整數n在二進位制表示下的第k位取反 n xor 1 取出整數n在二進位制表示下的第k位賦值...