首先,我們來說一下圖當中的最小生成樹,對於乙個無向圖來說,它的最小生成樹的定義如下:
1,該數經過所有的結點
2,經過的所有的結點的邊權之和最小
3,這棵樹的起點可以是任意的點,不過一般都是題目中指定的
prim演算法:
適用範圍:邊多點少的稠密圖。
複雜度:o(v^2)
與dijkstra演算法相比,該演算法的區別是裡面的d陣列,dijkstra演算法的d表示的是當前的結點v距離起始節點s的最短距離,而該演算法的d表示的是當前結點和它的上乙個結點之間的最短距離。我們的dijkstra演算法裡面的起點在我們的prim演算法中是乙個集合s,prim演算法的思路是對邊進行乙個貪心,逐個逐個邊進行貪心,最後得到最優解。
**:
const
int maxn=
2020
;const
int inf=
1000000000
;int g[maxn]
[maxn]
,d[maxn]
;bool vis[maxn]=;
intprim
(int s)}if
(u==-1
)return-1
; vis[u]
=true
; ans+
=d[u]
;//記錄路徑距離
for(
int v=
0;v}return ans;
}
kurskal演算法:
適用範圍:點多邊少的稀疏圖
複雜度:o(eloge),e為圖的邊數
該演算法主要是通過從整體進行乙個貪心的策略,檢查所有的邊,找出權最小的邊進行儲存。
但是,還有兩個前提:
1,如果加入這條邊之後與已經加入的邊形成乙個連通圖,也就是會形成環,那麼就不能把這條邊加入。
2,如果此時的邊的數量等於結點數量-1的話,那麼就可以直接退出迴圈了。
主要需要解決的是兩個問題:
1,怎麼確定加上這條邊後會不會是乙個連通圖?這個可以用之前學過的並查集先進行處理,然後後面要用到的時候再進行判斷。
2,如何儲存我們的加入的邊?還是用到並查集,通過並查集中的合併的函式來進行處理。
**:
const
int maxn=
100;
struct edgee[maxn]
;bool
cmp(edge a,edge b)
int father[maxn]
;int n,m;
intfindfather
(int x)
while
(a!=father[a]
)return x;
}int
kruskal
(int n,
int m)
sort
(e,e+m,cmp)
;for
(int i=
0;iif(num_edge!=n-1)
return-1
;else
return ans;
}
最小生成樹之prim演算法
最小生成樹的演算法思想和介面介紹過的求單源的最短路徑演算法dijkstra演算法有很多相似地方,甚至很多 都是一樣。prim演算法要解決的主要問題是路徑的最短問題。假設平面上有很多點,各個點之間有很多的線連線起來,並且到達各個點的距離不相同,需要求出一條路徑,使得各個點都能被連線起來,並且他們的距離...
最小生成樹之prim演算法
普利姆演算法 prim algorithm 最小生成樹的概念 所謂最小生成樹,就是在乙個具有n個頂點的帶權連通圖g中,如果存在某個子圖g 其包含了圖g中的所有頂點和一部分邊,且不形成迴路,並且子圖g 的各邊權值之和最小,則稱g 為圖g的最小生成樹。普利姆演算法 prim algorithm 演算法描...
最小生成樹之prim演算法
mst minimum spanning tree,最小生成樹 問題有兩種通用的解法,prim演算法就是其中之一,它是從點的方面考慮構建一顆mst,大致思想是 設圖g頂點集合為u,首先任意選擇圖g中的一點作為起始點a,將該點加入集合v,再從集合u v中找到另一點b使得點b到v中任意一點的權值最小,此...