兩種最短路演算法總結

2021-10-03 23:34:13 字數 1095 閱讀 2450

這裡只總結兩種最短路演算法,第一是:dijkstra,第二是:spfa;

這兩種演算法都用了佇列優化,dijkstra是優先佇列,spfa是普通佇列;

dijkstra

先介紹第一種,也是用的最多的一種最短路演算法:dijkstra;

這種演算法的思想就是先根據給定的起點 s ,找到這個點 s 所能連的點,更新一下所能連到的點的路徑,然後放入優先佇列裡面;優先佇列維護兩個東西,乙個是起點 s 到這個點的路徑權值,乙個是這個點的標號;

這裡重點要說的是對於負權邊的處理,對於負權邊,dijkstra是沒法處理的,

比如:1–2 權值為1

2–3 權值為-3

3–1 權值為2

根據dijkstra的每個點只遍歷一遍,所以1–2的最短路是1,而不是-1;當然保證最短路每條邊只走一次;

dijkstra模板:

struct nodeedge[m*2]

;void

add(

int p,

int q,

int w)

struct node};

void

dij(ll *dis,

int st));

while

(!qu.

empty()

));}

}}}

spfa

這裡先說一下,除非有負權邊和負環要用spfa,其他一概不用它;

這個演算法和 dijkstra 的區別還是挺大的:

queue而不是priority_queue;

當乙個點出隊時,要擦掉它的標記,保證它可以被再次遍歷到;

統計每個點的遍歷次數,如果大於等於 n 次,說明有負環;

這裡不在深入解釋這個演算法:

struct nodeedge[n]

;void

add(

int p,

int q,

int w)

bool

spfa()

}}return

false

;}

最短路演算法總結

1.floyd演算法 n 3複雜度 基本思想 開始設集合s的初始狀態為空,然後依次將0,1,n 1定點加入,同時用d i j 儲存從i到j,僅經過s中的定點的最短路徑,在初始時刻,d i j a i j 中間不經過任何節點,然後依次向s中插入節點,並進行如下更新 d k i j min 還可以使用乙...

最短路演算法總結

藉著usaco 3.26搞了幾天最短路。不得不說usaco真是菜鳥學習演算法的利器啊,有資料可以查錯。題上是乙個800 800的稀疏圖,需要求全源最短路 先用floyd試了一下。畢竟就三行,很好寫。時間o n3 裸交第九個點果然tle了,不過看題解有人水過了 就把邏輯語言改了一下,無向圖時間又可以優...

最短路演算法總結

dijkstra演算法 dijkstra 迪傑斯特拉 演算法是典型的單源最短路徑演算法,用於計算乙個節點到其他所有節點的最短路徑。最常見的問題就是 給你一張地圖,讓你求出指定的點到其餘各定點的最短路徑。演算法核心 每次找到離源點最近的乙個頂點,然後以該頂點為中心進行擴充套件,最終的到源點到其餘所有點...