dijkstra雙層圖的一種解決方法
Original Ideas and similar code from here
- 基礎建立在堆優化dijkstra(保留vis數組)之上
- 在單層圖的情況下,我們可以在dijkstra()函數之外建立一個數組d,d[x]用於保存從出發點到x點的距離大小
- 在dijkstra求距離之前置出發點的距離爲0
- 在雙層圖的情況下需要做出的改變:
- 存距離大小時仍使用數組d,但要開成d [點的個數n] [第二層圖的邊數]
- 存邊時對兩層圖在存邊的屬性的結構體中增加一個flag(mark/etc.)變量對兩層圖進行區分
- 建圖時在存點的屬性的結構體中增加一個k變量用於記錄第二層圖走過的邊數
- 求最小距離時對隊列彈出的結構體t存儲的距離不符合d[對應的點][對應的第二層走過的邊數]時直接continue
- 求最小距離時存入隊列的結構體tt(以把存點的屬性的結構體傳入爲例):
…如果當前邊是第二層圖,tt.k = t.k + 1; 否則 tt.k = t. k
…tt存儲的距離 = 當前d[對應的點][對應的第二層走過的邊數]
(以下內容沒有經過實踐檢驗,慎用)
- x層圖則把d開成x維數組,需要的標記變量也在結構體中添上
- (但是 空間複雜度n*m^k,(n對應點數,m爲從第二層開始每層圖的可用邊數,k爲圖的層數-1),圖的層數多而且邊又多的情況下空間應該會炸的非常慘)