迷宮問題 與 最短路徑 怎樣記錄路徑的總結(dijikstra,bfs,floyd,優先佇列)
阿新 • • 發佈:2019-02-19
這次集訓做了幾個關於記錄路徑的問題,大體基於迪傑斯特拉(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二維陣列就是這麼記錄路徑的。