1. 程式人生 > >迷宮問題 與 最短路徑 怎樣記錄路徑的總結(dijikstra,bfs,floyd,優先佇列)

迷宮問題 與 最短路徑 怎樣記錄路徑的總結(dijikstra,bfs,floyd,優先佇列)

這次集訓做了幾個關於記錄路徑的問題,大體基於迪傑斯特拉(dijikstra)和弗洛伊德(floyd)演算法還有BFS廣搜。

記錄前驅要比記錄後驅更保險,因為從終點往起點追溯很容易,而從起點往後追溯有很多岔路口。

以下給出幾種記錄路徑的方法。

1、佇列 或 自定義佇列(針對BFS)。

自己定義了一個數組充當佇列,在bfs過程中每走一步都要記錄下上一步所走的點,裝在佇列中的位置下標。集體操作見參考題目。(自定義的佇列有缺點,可能會因為陣列不夠用而越界)

佇列的話,記錄前驅路徑直接記錄前驅的座標。

每個點到達時,若被更新,說明路變短了,所以最後一次更新某個點,就這個點的最短路,

所以每次更新時記錄這個點的前驅點,演算法結束時,一定是最短路前驅。

優先佇列可以解決 迷宮問題中 步數受走過的點影響 的問題。

2、一維陣列記錄前驅路徑(主要針對最短路徑dijikstra及floyd)

定義一個數組path[1100],陣列下標代表當前位置,元素值代表該位置的前驅位置。最後從終點倒退回到起點,這樣就的到了行走路徑。

3、二維陣列記錄路徑

如果是floyd演算法,二維陣列記錄後驅路徑很方便。即用path[i][j] 表示從 i 到 j 的路徑中第一個經過的點。參考(學長部落格):

也可以用二維陣列path[i][j]記錄座標點 i , j 的前驅路徑,也適用於迷宮問題記錄路徑,很方便。

可行性說明:同1中的紅字。

參考(學長部落格):

其中的flag二維陣列就是這麼記錄路徑的。