此文章借鑑於博文在此基礎上重新進行了分析總結。
1、怎麼求頂點子集,即這些怎麼記錄?
答:例如4個頂點,依次為{},,,,,,,。十進位制數0、1、2、3、4、5、6、7的二進位制分別為000、001、010、011、100、101、110、111。上述集合中的元素即為二進位制中的位數,例如集合,可用二進位制110(十進位制6)代替,因為二進位制110的第一位是0,第二位第三位是1。
整理一下思路——十進位制數的二進位制表示中,哪位為1則集合中就有哪個數。十進位制6的二進位制110中,第二三位是1,則6代表集合
沒有為什麼,這是我們定下的一條規則,方便我們解題。
如此,過程矩陣d[i][j]的縱座標j就多了乙個含義。j=0,代表集合;j=1,代表集合……j=5,代表集合……以此類推。
大家可能發現乙個問題,在4個頂點中,十進位制3代表,十進位制4代表,而我們一般寫的集合順序是{},,,,,,,。集合是第3個,是第4個。會發現順序亂了,這個要說一下,集合之間的排序不影響此題的解答,讀者朋友可以將集合以任意順序寫,會發現不影響最終結果的出現。
2、判斷乙個頂點是否位於子集中
舉例解答,如要判斷集合j=是否有頂點3。
集合j=表示成二進位制串為1110101,其中集合裡面有的數對應的位數寫成1,沒有的寫成0。要在集合中找頂點3,就是要判斷二進位制串第3位是不是1,就把1110101右移(3-1)位,得到11101,然後結果和00001進行&運算,如果結果是1說明第3位是1,則說明頂點在子集中。
故判斷公式為
(j>>(i-1))&1==13、填寫過程矩陣過程arc[i][j]為圖的代價矩陣。
d[i][j]為過程矩陣,存放迭代結果。
以d[2][5]為例,d[2][5]=d(2,)。d[2][5] 表示從2出發,通過{1,3},最後回到起點。那麼d[2][5] = min),arc[2][3] + d(3,)} = min。從2出發,要去,先考慮去1的路。去了1後集合中只剩下 ,對應二進位制100,十進位制4,所以要求的d表就是d[1][4],這個4可以通過(101)^(1)得到,而(1) = 1<
d[i][j] = min
#include
#include
using
namespace std;
struct rode rode[
100]
[100];
//記錄過程矩陣中的路線,由點x出發,先經過點k,再經過集合z,過程矩陣j[i][j]中的j就代表集合
intmain()
//初始化第0列
for(i =
0; i < n; i++
) d[i][0
]= arc[i][0
];//填過程矩陣,第一行,因為第一行代表從頂點0開始經過一些頂點再回到0,但是我們只需要d[0][m-1]這乙個值,所以第一行先不計算,等最後再只計算d[0][m-1],節省時間。
for(j =
1; j < m; j++
)//j就代表m個子集,如j=5(二進位制為101)代表,j=3(二進位制為011)代表。二進位制1011就代表集合。這是設定的一種規則。
中有元素2。之所以這麼做,
是因為我們人知道j=6(二進位制110)代表集合,但是計算機不知道,所以要有找元素這一步*/if(
((j >>
(k -1)
)&1)
==0)//集合中沒有此元素就跳過
continue
;/*以d[2][5]為例,d[2][5]=d(2,)。d[2][5] 表示從2出發,通過{1,3},最後回到起點。
那麼d[2][5] = min),arc[2][3] + d(3,)} = min。
從2出發,要去,先考慮去1的路。去了1後集合中只剩下 ,對應二進位制100,十進位制4,所以要求的d表就是d[1][4],這個4可以通過(101)^(1)得到,而(1) = 1<
再看去3的路,去了3後集合中只剩下,對應二進位制001,十進位制1,所以要求的d表就是d[3][1],1通過(101) ^ (100)得到,而(100) = 1<
if(d[i]
[j]> arc[i]
[k]+ d[k]
[j ^(1
<<
(k -1)
)])}
}}//計算d[0][m-1],d(0,)=min),arc[0][2]+d(2,),arc[2][3]+d(3,)}
for(j =
0; j < m -
1; j++
) d[0]
[j]=-1
; d[0]
[m -1]
=0x7ffff
;for
(k =
1; k < n; k++)}
cout <<
"最短路徑為:"
<< d[0]
[m-1
]<< endl;
//輸出路線
j = m -1;
cout <<
"0→"
;for
(i=0
;i1;i++
) cout<< rode[i]
[j].y << endl;
//輸出過程矩陣
cout <<
"過程矩陣為:"
TSP問題,動態規劃法
tsp問題是指旅行家要旅行n個城市,要求各個城市經歷且僅經歷一次然後回到出發城市,並要求所走的路程最短。各個城市間的距離可以用代價矩陣來表示。假設從頂點i出發,令d i,v 表示從頂點i出發經過v 中各個頂點一次且僅一次,最後回到出發點i的最短路徑長度,開始時,v v 於是,tsp問題的動態規劃函式...
TSP問題(利用動態規劃法)
tsp問題是指旅行家要旅行n個城市,要求各個城市經歷且僅經歷一次然後回到出發城市,並要求所走的路線圖最短。無窮3 675無窮 2364 無窮267 5無窮待補充 define crt secure no warnings include include using namespace std str...
動態規劃法求解RMQ
題目描述 思路分析 下面把sparse table演算法分成預處理和查詢兩部分來說明 以求最小值為例 預處理 預處理使用dp的思想,f i,j 表示 i,i 2 j 1 區間中的最小值,我們可以開闢乙個陣列專門來儲存f i,j 的值。例如,f 0,0 表示 0,0 之間的最小值,就是num 0 f ...