dij與prim演算法

2022-02-06 05:09:07 字數 994 閱讀 2933

兩種演算法本質是相同的。

都是從某乙個點開始進行延伸,不斷更新乙個dis值,直到所有的點都被遍歷到,從而求出乙個最短路或者是乙個樹的邊權的最小總和。

樸素演算法都是n^2,都可以採用堆優化處理,降低複雜度到mlogn.

但是在一張完全圖上跑,此時m=n^2,樸素演算法反而快一些。而且常數小。

相比較於spfa,dij可以穩定的mlogn 或者 n^2.

spfa理論上是ke,但是完全圖上e=n^2,直接多乘了乙個k,而且傳說卡spfa是比較好卡的。所以圖比較稠密的時候,dij能用,就用dij。

spfa最大的優點就是可以處理負邊權。

dij**核心:(堆優化)

樸素時候,直接扔掉優先佇列,迴圈一遍找最小dis值。(也是n^2所在)

struct

point

};priority_queue

q;void

dij()}}

}

prim與kruskal比較,其優點也是在完全圖上有穩定的複雜度n^2.

prim也可以用堆優化,但是完全圖上同樣也是樸素更快。

kruskal的複雜度侷限在於排序。mlogm直接送出。m=n^2慢炸。

**核心:(堆優化)

樸素時候,直接扔掉優先佇列,迴圈一遍找最小dis值。(也是n^2所在)

struct

point

};priority_queue

q;int

n,m;

intsum;

bool

vis[n];

bool

work()}}

if(has==n) return

true

;

return

false

;}

總結:1.spfa,kruskal在稀疏圖上有優勢。

2.dij,prim稠密圖上佔優。

3.dij不能處理負邊權,spfa可以。

Prim演算法 與 dijkstra演算法

有時總將兩者搞混,兩者都是基於貪心策略,且都是將圖中頂點劃分為兩部分,每次取最小值。在這裡對兩者的演算法做乙個區分。prim演算法是解決圖的 最小生成樹 問題,在每次迴圈中,選取乙個點在s中,另乙個點在v s中,且兩點權值最小,直到v s為空。dijkstra演算法是解決圖的 最短路徑 問題,即從某...

prim與dijksra演算法比較

這兩種演算法都是基於貪心的,但是這兩個演算法的目的不同 prim演算法是將圖生成乙個一棵樹,這棵樹的邊權值和是這個圖能生成的所有樹中最小的。dijksra演算法是求圖中某個節點到所有其他節點的分別的最短路徑 即求的是一組路徑,每條路徑都從起點出發通向圖中的乙個不同頂點,當然,其中某些路徑可能具有公共...

dij演算法堆優化 Floyd演算法

乙個號稱只有5行 的演算法,由1978年圖靈獎獲得者 史丹福大學電腦科學系教授羅伯特 弗洛伊德命名。該演算法有於求乙個帶權有向圖 wighted directed graph 的任意兩點的最短距離的演算法,運用了動態規劃的思想,演算法的時間複雜度為o v 3 空間複雜度o v 2 其核心思想是,在兩...