普利姆(Prim)演算法

2021-06-17 22:21:52 字數 1045 閱讀 5927

設:n =(v , e)是個連通網,另設u為最小生成樹的頂點集,te為最小生成樹的邊集。

普利姆(prim)演算法步驟:

(1)初始狀態: u =,( u0 ∈v ),te= φ,

(2)在u∈u ,v∈(v-u)所有的邊(u,v)∈e中,找一條代價最小的邊(u0,v0),並將邊(u0,v0)併入集合te,同時v0併入u。

(3)重複(2),直到u=v為止。

此時te中必有n-1條邊,t=(v,)就是最小生成樹。

注:在最小生成樹的生成過程中,所選的邊都是一端在u中,另一端在v-u中。選最小邊的過程是乙個向集合u中新增頂點的過程。

例:利用普利姆(prim)演算法對下面的連通網構造一棵最小生成樹。

在生成樹的構造過程中,圖中 n 個頂點分屬兩個集合:已落在生成樹上的頂點集 u 和尚未落在生成樹上的頂點集v-u ,則應在所有連通u中頂點u和v-u中頂點v的邊中選取權值最小的邊(u』,v』),並把v』新增到u中。

下面我們考慮一下如何實現這個操作過程的演算法。

分析 :(1)它主要有兩項操作:按條件選擇一條邊和將頂點加入到u集合中;(2)網中的每個頂點不是在u集合中,就是在v-u集合中。為了提高演算法的時間、空間效率,我們將為這個演算法設計乙個輔助陣列closedge,用來記錄從集合u到集合v-u具有最小權值的邊。對每個屬於v-u集合的頂點,在輔助陣列中存在乙個相應的分量closedge[i-1],它包括兩個域,乙個域用來表示在該頂點與v-u集合中某些頂點構成的邊中權最小的那條邊的權值,若該頂點進入u集合,則值為0;另乙個域表示這條最小權值的邊對應的在v-u集合中的頂點下標。其型別定義如下所示:

#define max_num  10

struct closedge[max_num];

整個演算法的執行過程可以描述為:

假設該網以鄰接矩陣的形式給出,則完整的演算法為:

void mini_spantree(graph g,int k,int n)

; closedge[k].lowcost=0;

for (i=1;i

; }

}

普利姆演算法

演算法思想 可取圖中任意乙個頂點v作為生成樹的根,之後若要往生成樹上新增頂點w,則在頂點v和w之間必定存在一條邊。並且該邊的權值在所有連通頂點v和w之間的邊中取值最小。一般情況下,假設n個頂點分成兩個集合 u 包含已落在生成樹上的結點 和v u 尚未落在生成樹上的頂點 則在所有連通u中頂點和v u中...

普利姆演算法

普利姆 prim 這個演算法有什麼用?在實際中這個演算法經常用到電子板的電路連線中,因為可以使用到最少的連線將所有的電子連線起來,又打個比方在鋪設電線將所有使用者連線起來可以使用最少的電線連線起來 知道了這個作用之後你是不是比較感興趣呢?首先看 prim演算法生成最小生成樹 void minispa...

普利姆演算法

演算法思想 可取圖中任意乙個頂點v作為生成樹的根,之後若要往生成樹上新增頂點w,則在頂點v和w之間必定存在一條邊。並且該邊的權值在所有連通頂點v和w之間的邊中取值最小。一般情況下,假設n個頂點分成兩個集合 u 包含已落在生成樹上的結點 和v u 尚未落在生成樹上的頂點 則在所有連通u中頂點和v u中...