克魯斯卡爾演算法 Kruskal

2021-07-05 14:51:30 字數 1163 閱讀 999

克魯斯卡爾(kruskal)演算法是一種按權值的遞增次序選擇合適的邊來構造最小生成樹的方法。假設g=

(v,e

) 是乙個具有

n 個頂點的帶權連通圖,t=

(u,t

e)是g

的最小生成樹,則構造最小生成樹的步驟如下:

1) 設定

u的初值等於

v (即包含有

g中的全部頂點), te

的初值為空集(即圖

t 中每乙個頂點都構成乙個分量)。

2) 將圖

g中的邊按權值從小到大的順序依次選取。若選取的邊沒有使樹

t 生成迴路,則將該邊加入te

; 否則捨棄,直到te

包含(n

−1) 條邊為止。

實現克魯斯卡爾演算法的關鍵是,如何判斷選取的邊是否與生成樹中已保留的邊形成迴路,這可以通過判斷邊的兩個頂點所在的連通分量的方法來解決。

為此設定乙個輔助陣列vs

et[0..n−

1], 它用於判定兩個頂點之間是否連通。陣列元素vs

et[i

] (初值為

i )代表序號為

i的頂點所屬的連通頂點集的編號(當選中不連通的兩個頂點間的一條邊時,它們分屬的兩個頂點集合按其中的乙個編號)。當兩個頂點的集合編號不同時,加入這兩個頂點構成的邊到最小生成樹時一定不會形成迴路。 採用e

陣列存放圖

g中的所有邊,採用直接插入排序的方法將所有邊按權值從小到大的順序排列。

e 陣列元素型別如下:  

typedef

struct

edge;

kruskal演算法如下:

void sortedge(mgraph g,edge e)    //從鄰接矩陣產生權值遞增的邊集

e[j+1]=temp; //在j+1處插入e[i]

}}void kruskal(edge e,int n,int e)

j++; //掃瞄下一條邊

}}

克魯斯卡爾演算法的時間複雜度為o(

elog

e), 這個e是圖的邊數,它的時間複雜度與頂點數

n 無關,只與邊數

e有關,該演算法適用於稀疏圖。

kruskal克魯斯卡爾演算法

給定乙個帶權的無向連通圖,如何選取一棵生成樹,使樹上所有邊上權的總和為最小,這叫最小生成樹.求最小生成樹的演算法 1 克魯斯卡爾演算法 圖的存貯結構採用 邊集陣列 且權值相等的邊在陣列中排列次序可以是任意的.該方法對於邊相對比較多的不是很實用,浪費時間 方法 將圖中邊按其權值由小到大的次序順序選取,...

克魯斯卡爾 Kruskal 演算法

設g v,e 是具有n個頂點的連通網,t u,te 是其最小生成樹。初值 u v,te 對g中的邊按權值大小從小到大依次選取。選取權值最小的邊 vi,vj 若邊 vi,vj 加入到te後形成迴路,則捨棄該邊 邊 vi,vj 否則,將該邊併入到te中,即te te 重複 直到te中包含有n 1條邊為止...

克魯斯卡爾 Kruskal 演算法

1 克魯斯卡爾演算法使用來求加權連通圖的最小生成樹的演算法 2 基本思想 按照權值從小到大的順序選擇n 1條邊,並保證n 1條邊不構成迴路。3 具體做法 先將各路的權值按照從小到大排序,然後建立乙個最終點的陣列。通過最終點的陣列來實現不構成迴路。構建最小生成樹的節點 頂點 資訊。class edat...