右邊為第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位賦值...