最短路徑(Dijsktra算法、Floyd算法)


1、最短路徑:

  兩個結點之間,帶權路徑長度最短的路徑。

  常用算法是Dijkstra算法和Floyd算法,區別在於Dijsktra算法每次只能算出某一個結點到其他結點的最短路徑,而Floyd算法可以直接把圖中任意兩個結點的最短路徑都算出來

  最短路徑一定是簡單路徑。

2、Dijkstra(迪傑斯特拉)算法

  a、利用了三個數組

       dist [  ]   表示距離源點的距離

      path [  ]  記錄現在結點的上一個結點

           s [  ]  記錄該結點有沒有被訪問過

  b、無論用鄰接矩陣還是鄰接表存儲,時間復雜度都為O(|V|2) 

  c、邊上帶有負權值時,不能使用Dijkstra算法。

  d、每次都從中找未被訪問過的距離源點最近哪個結點(比如離A最近的C),然后以這個結點(C)為中心,看這個結點(C)指向哪些其他的結點(E、F),然后更新這些結點(E、F)的值(就是如果加起來的值比原來的要小,則更新,說明找到更短的路徑)。然后再從未訪問的結點中,選取離源點最近的值,重復以上操作。等到所有結點都訪問過后,最后一輪得到的就是所有其他結點到源點的最短路徑長度

   e、答題的時候,一般要求把最后一輪得到的表寫下來,根據這個表可以得到源點到其他結點最短路徑長度,以及中間經過哪些結點。下圖為一個例子:

 3、Floyd(弗洛依德)算法

  a、Floyd算法可以允許圖中帶有負權值的邊,但是不能有帶負權值的邊組成的回路

  b、時間復雜度是O(|V|3,因為把建立臨界矩陣需要遍歷一遍,再一次輪流把經過每一個結點(第二遍),到達其他所有的結點(第三遍)的距離與現在的距離比較,如果更小則更新。

  c、原理:

  d、最終得到的表如何看最短路徑和路徑上經過的序列是多少:

     下圖為例子:比如a15,就是從1結點到5結點最短距離是60,從P矩陣可以知道,經過了4結點,即1 — 4 — 5,再看1,4之間,沒有其他結點,4,5之間,又經過3結點。這樣依次找下去,就可以得到路徑。


免責聲明!

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



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