最小生成樹之prim演算法 kurskal演算法

2021-10-08 12:49:49 字數 1598 閱讀 5699

首先,我們來說一下圖當中的最小生成樹,對於乙個無向圖來說,它的最小生成樹的定義如下:

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中任意一點的權值最小,此...