演算法導論 23 2 Kruskal演算法

2021-08-21 06:54:40 字數 1963 閱讀 1789

一,kruskal演算法的思想

kruskal演算法對最小生成樹安全邊的通用確定規則進行了細化,在該演算法中,集合a是乙個森林,其結點就是給定圖的結點,每次加入到集合a中的安全邊永遠是權重最小的連線兩個不同分量的邊。

二,kruskal演算法介紹

準備階段:乙個賦值無向連通圖g=(v,e),我們需要乙個集合a用於存放加入的安全邊,最後a中的邊形成最小生成樹

演算法過程:在所有連線森林中兩棵不同樹的邊中,找到權重最小的邊(u,v),由於這條邊連線了兩棵樹,因此他一定橫跨某個切割,再加上是權重最小的邊,所以滿足安全邊的辨別定理。

三,kruskal演算法偽**

mst_kruskal(g,w)

1. a=∅

2. for each vertex v∈g.v

3.     make_set(v)

4. sort the edges of g.e into nondecreasing order by weight w

5. for each edge(u,v)∈g.e,taken in nondecreasing order by weight

6.     if find_set(u)≠find_set(v)

7.         a=a∪

8.         union(u,v)

9. return a

第1行中,引入集合a並設為空集;第2.3行中,make_set方法讓每個結點都成為乙個集合(樹),每個集合都只先有乙個結點;第4行中,由於我們每次要找權重最小的邊,所以我們把所有邊按權重公升序排列;第5-8行,按照邊的權重公升序的次序依次取出邊(u,v),通過find_set方法檢查邊的兩端u和v是否在同乙個集合(樹)裡,若不在乙個集合(樹)裡,這條邊就為安全邊,將這條邊(u,v)加入集合a中,並將u、v兩個集合(樹)合併;第9行返回集合a

以書上的例子為例,圖a中,我們找到權重最小的邊(h,g),由於h(集合為)和g(集合為)不在同乙個集合裡,因此將這條邊加入集合a中,我們把他塗上陰影,並且將兩個端點h和g合併,即h、g的集合均為;圖b-e中,我們接著找到了權重最小的4條邊(c,i)、(g,f)、(a,b)、(c,f),由於他們的端點都不在乙個集合裡,因此都加入集合a,塗上陰影並且合併兩個端點,合併後的集合情況為:,;圖f中,我們繼續找剩下邊中權值最小的邊(i,g),由於i、g在同乙個集合中,所以不加入集合a;圖g到圖n,依然遵循上述規律,最後塗上陰影的邊即集合a,即最小生成樹

四,kruskal演算法的複雜度

時間複雜度:o(elgv)或o(elge)

五,kruskal演算法的**

**中建立了乙個二維陣列,第一維為各結點,第二維為各結點的集合

tree * kruskal_algo(graph * graph)

vectorunpickededge= graph->getedgelist();//建立並初始化未被取出的邊的集合

for (int i = 0; i < edgestotalnum; i++)//遍歷所有邊

}if (nodeset[find_set(nodeset, u)] != nodeset[find_set(nodeset, v)])//若u,v不屬於同乙個集合

unpickededge.erase(unpickededge.begin() + minedgeid);//從未被取出的邊中刪除該邊

} return t;

}

int find_set(vector> set,node * u)//找到含有頂點u的頂點集合,返回所在行數

} }}

void union_set(vector> &nodeset, int a,int b)//合併兩個頂點集合(兩行)

nodeset[a] = nodeset[b];

}

演算法導論第二章 練習2 3 2

用陣列下表限制陣列越界 原題是用乙個無窮大值做哨兵,另一中方法,用函式下表限制陣列越界即可,用乙個if判斷來寫 直接上 講可能講不太清楚 includevoid mergesort int number,int p,int r void merge int number,int p,int q,in...

最小生成樹 Prim演算法和Kruskal演算法

最小生成樹 3條構造最小生成樹的準則 只能使用該網路中的邊來構造最小生成樹 只能使用恰好n 1條邊來聯結網路中的n個結點 選用的這個n 1條邊不能構成迴路。mst性質 假設n v,是乙個連通網,u是頂點集合v的乙個非空子集。若 u,v 是一條具有最小值 代價 的邊,其中u屬於u,v屬於v u 即u對...

最小生成樹 Prim演算法和Kruskal演算法

轉於 prim演算法 設圖g v,e 其生成樹的頂點集合為u。把v0放入u。在所有u u,v v u的邊 u,v e中找一條最小權值的邊,加入生成樹。把 找到的邊的v加入u集合。如果u集合已有n個元素,則結束,否則繼續執行 其演算法的時間複雜度為o n 2 define maxn boolflag ...