最短路徑搜索算法


 BFS與DFS

  • BFS:這是一種基於隊列這種數據結構的搜索方式,它的特點是由每一個狀態可以擴展出許多狀態,然后再以此擴展,直到找到目標狀態或者隊列中頭尾指針相遇,即隊列中所有狀態都已處理完畢。
  • DFS:基於遞歸的搜索方式,它的特點是由一個狀態拓展一個狀態,然后不停拓展,直到找到目標或者無法繼續拓展結束一個狀態的遞歸。

廣度優先搜索-BFS

  它的思想是從一個頂點V0開始,輻射狀地優先遍歷其周圍較廣的區域。

  適用於迷宮類問題。

  鏈接:http://blog.csdn.net/raphealguo/article/details/7523411

深度優先搜索-DFS

  http://blog.csdn.net/ns_code/article/details/19617187

Floyd-Warshall算法

  任意兩個點之間最短路徑。它的時間復雜度是O(N3)。求指定兩點之間的最短路或者指定一個點到其余各個頂點的最短路徑也是可行的。

  對於每一個節點k,我們檢查Dis(i,k) + Dis(k,j) < Dis(i,j)是否成立。

  鏈接:http://developer.51cto.com/art/201403/433874.htm

Dijkstra(迪傑斯特拉)算法

  是典型的單源最短路徑算法,用於計算一個節點到其他所有節點的最短路徑。

  Dijksra的算法是一個貪婪算法,時間復雜度是O(VLogV)(使用最小堆)。

  鏈接:http://www.cnblogs.com/biyeymyhjob/archive/2012/07/31/2615833.html

Bellman-Ford  在網絡路由中,該算法會被用作距離向量路由算法。

  Bellman-Ford也比迪傑斯特拉算法更簡單和同時也適用於分布式系統。但Bellman-Ford的時間復雜度是O(VE),E為邊的個數,這要比迪傑斯特拉算法慢。

spfa算法

  時間復雜度為O(ke),k為所以頂點進隊的平均次數,k一般小於等於2

  鏈接:http://www.360doc.com/content/13/1208/22/14357424_335569176.shtml

 

最小生成樹問題

  Kruskal算法,貪心算法;

  Prim算法,其從某一源點出發,維持一個集合A(A內結點構成一棵樹),算法每次選擇從A出發到A外的結點中的一條權重最小的邊,然后將這條邊加入集合A中。 

 

http://blog.csdn.net/tostq/article/details/52733071

 

A*算法

  A*算法與BFS:可以這樣說,BFS是A*算法的一個特例。對於一個BFS算法,從當前節點擴展出來的每一個節點(如果沒有被訪問過的話)都要放進隊列進行進一步擴展。也就是說BFS的估計函數h永遠等於0,沒有一點啟發式的信息,可以認為BFS是“最爛的”A*算法。

  鏈接:http://www.cppblog.com/mythit/archive/2009/04/19/80492.aspx


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM