最小生成樹

2021-07-02 15:38:12 字數 1450 閱讀 7164

資料結構——最小生成樹(mst)

什麼是最小生成樹?

乙個有 n 個結點的連通圖的生成樹是原圖的極小連通子圖,且包含原圖中的所有 n 個結點,並且有保持圖連通的最少的邊。

最小生成樹的用途

mst 性質

假設n=(v,)是乙個連通網,u是頂點集v的乙個非空子集。若(u,v)是一條具有最小權值(代價)的邊,其中u∈u,v ∈v-u,則最小生成樹中必包含邊(u,v)。

根據 mst 性質 的兩種解法

普利姆演算法

克魯斯卡爾演算法

區別

1. 第一步的側重點不同: 普利姆演算法是先保證不構成迴路,然後依次求得最小的n-1條邊。而克魯斯卡爾演算法則是先排序找到當前最小邊,,然後再確保不構成迴路,最後集齊n-1條邊。至此最小生生成樹的偉大任務 完成^_^

2.具體問題選取的時候不同: 普利姆演算法 通常用與稠密圖,而克魯斯卡爾演算法通常用於稀疏圖。

思想

注:點集u 。已經位與生成樹t中的點的集合u 。剩餘的點u-u

對於普利姆演算法:

借助乙個陣列,這個陣列是訪問當前剩餘的點到生成樹中的點最小的權值例如:closdge[5] ,裡面儲存的是點4到現有的生成樹t的中的最小的邊的相關的資訊。當然,會用到之前新加入到生成樹中的點,以此來求的現有的closedge.

因此,我們需要設定乙個變數k儲存新加入的點,藉此更新closedge陣列。

對於克魯斯卡爾演算法,就要簡單的多了(應該掌握,所以,就說的詳細點吧)。

這個演算法是先保證邊權最小,那麼顯而易見的就要按邊權排序啦,(此處可以用qsort 或是sort, 反正都是庫裡面的,實在不知道,那就冒泡吧)

排過序之後,就要構建生成樹啦,。怎麼辦呢?,這個好辦,直接加邊唄(注意不要構成迴路哦!)。

不構成迴路可以採用並查集的思想,,即:元素是否在乙個集合中。?這個我們要用程式標識出來,很容易我們可以想到用標識陣列,(這一點,我們是站在每個元素的角度上考慮的) 。我們可以用乙個陣列,用下標表示這個元素,用他裡面的值來表示他所在的集合,我們可以用flag[5]=2,flag[7]=2 ,….來表示5和7位與同乙個集合2中。

因為如果兩個點位與同乙個最小生成子樹 中的時候,加入這兩個點之間的邊,就會形成迴路。

(最小生成樹的乙個性質就是如果連線其中的兩個點,就會形成迴路。當然這個兩個點就是位與生成樹中的啦,所以我們應該保證我們選取的邊所依附的兩個點位與不同的點的集合(或是連通子圖),這樣就不會形成迴路了)

這樣我們的工作完成的就差不多了,我們只需按照上面的依次找到n-1條邊,就ok啦。

具體的**?大家先思考,以後補上。

最小生成樹 次小生成樹

一 最小生成樹 說到生成樹首先要解釋一下樹,樹是乙個聯通的無向無環圖,多棵樹的集合則被稱為森林。因此,樹具有許多性質 1.兩點之間的路徑是唯一的。2.邊數等於點數減一。3.連線任意兩點都會生成乙個環。對於乙個無向聯通圖g的子圖,如果它包含g的所有點,則它被稱為g的生成樹,而各邊權和最小的生成樹則被稱...

最小生成樹

package 圖 最小生成樹是用最少的邊吧把所有的節點連線起來。於是和圖的深度優先搜素差不多。class stack public void push int key public int pop 檢視棧頂的元素 public int peek public boolean isempty cla...

最小生成樹

define max vertex num 20 最大頂點數 typedef int adjmatrix max vertex num max vertex num 鄰接矩陣型別 typedef char vertextype typedef struct mgraph struct dnodecl...