圖論算法求兩點間所有路徑

最近寫的算法需要用到這項功能,遂在CSDN上找到了現成的算法。然而,那個算法存在一個不容易繞過去的坑,因此,總結在這裏,以作記錄。


以下轉自https://blog.csdn.net/ha000/article/details/52368566

1建圖:

     圖類中包括如下信息:頂點集合,鄰接矩陣。

     節點類中包括如下信息:是否被訪問過,節點的名稱,從這個節點訪問到下一個節點的集合

 

          

 

 

2 算法思路

  A 將始點設置爲已訪問,將其入棧

  B 查看棧頂節點V在圖中,有沒有可以到達、且沒有入棧、且沒有從這個節點V出發訪問過的節點

  C 如果有,則將找到的這個節點入棧

  D 如果沒有,則將節點V訪問到下一個節點的集合中每個元素賦值爲零,V出棧

  E 當棧頂元素爲終點時,設置終點沒有被訪問過,打印棧中元素,彈出棧頂節點

  F 重複執行B – E,直到棧中元素爲空

以上轉自https://blog.csdn.net/ha000/article/details/52368566


其中,E 當棧頂元素爲終點時,設置終點沒有被訪問過,打印棧中元素,彈出棧頂節點

這一句存在問題。

上述算法當且僅當邊結構爲鄰接矩陣,且所求兩點分別是第一個點和最後一個點的時候,才生效。

這是因爲,鄰接矩陣結構檢索節點的方式是有序的。如果棧頂元素爲終點,那麼,上一個節點從第一個節點遍歷到終點,棧頂元素是其檢測的最後一個點。因此,此時設置終點沒有被訪問過,彈出的其實是終點和終點的上一個節點。彈出終點就不用說了,彈出終點的上一個點是因爲,我們已經將這個點所有可能的連接都遍歷過了。

如果我們利用三元組的方式進行節點遍歷,就會出現問題。因爲,利用三元組進行遍歷,是無序的。誰也不知道什麼時候會遍歷到終點,終點的上一個點是否還有其他需要遍歷的路徑。

因此,如果能找到一種方法,使得利用三元組的遍歷也是有序的,或者至少保證最後遍歷含有終點的路徑,就能解決問題。

最後,博主相處了一種改動的方法:設置一個新的數組,存儲已經訪問過終點的節點。例如,d是終點,有c->d, 那麼我們就將c存入數組。在每次將新的節點壓入棧之前,判斷是否出現這種情況:頭節點在數組中,尾節點時終點d。如果這樣,就不沿這條路搜索。也就是說,將步驟B改動爲:

B 查看棧頂節點V在圖中,有沒有可以到達、且沒有入棧、且沒有從這個節點V出發訪問過的節點 且若當前節點已訪問過終點,還要求目標節點不是終點

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章