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結點。這樣依次找下去,就可以得到路徑。