兩種演算法本質是相同的。
都是從某乙個點開始進行延伸,不斷更新乙個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所在)
structpoint
};priority_queue
q;void
dij()}}
}
prim與kruskal比較,其優點也是在完全圖上有穩定的複雜度n^2.
prim也可以用堆優化,但是完全圖上同樣也是樸素更快。
kruskal的複雜度侷限在於排序。mlogm直接送出。m=n^2慢炸。
**核心:(堆優化)
樸素時候,直接扔掉優先佇列,迴圈一遍找最小dis值。(也是n^2所在)
structpoint
};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 其核心思想是,在兩...