Prim演算法和Kruskal演算法

2021-06-28 17:37:22 字數 1336 閱讀 9608

一、prim演算法:

prim演算法實現的是找出乙個有權重連通圖中的最小生成樹,即:具有最小權重且連線到所有結點的樹。(強調的是樹,樹是沒有迴路的)。

prim演算法是這樣來做的: 

首先以乙個結點作為最小生成樹的初始結點,然後以迭代的方式找出與最小生成樹中各結點權重最小邊,並加入到最小生成樹中。加入之後如果產生迴路則跳過這條邊,選擇下乙個結點。當所有結點都加入到最小生成樹中之後,就找出了連通圖中的最小生成樹了。

prim演算法最小生成樹查詢過程:

注意:若候選輕邊集中的輕邊不止一條,可任選其中的一條擴充到t中。

連通網的最小生成樹不一定是惟一的,但它們的權相等。

【例】在上圖(e)中,若選取的輕邊是(2,4)而不是(2,1)時,則得到如圖(h)所示的另一棵mst。

演算法特點

該演算法的特點是當前形成的集合t始終是一棵樹。將t中u和te分別看作紅點和紅邊集,v-u看作藍點集。演算法的每一步均是在連線紅、藍點集的紫邊中選擇一條輕邊擴充進t中。mst性質保證了此邊是安全的。t從任意的根r開始,並逐漸生長直至u=v,即t包含了 c中所有的頂點為止。mst性質確保此時的t是g的一棵mst。因為每次新增的邊是使樹中的權盡可能小,因此這是一種"貪心"的策略。

演算法分析

該演算法的時間複雜度為o(n2)。與圖中邊數無關,該演算法適合於稠密圖。

演算法演示:

二、kruskal演算法:

kruskal演算法與prim演算法的不同之處在於,kruskal在找最小生成樹結點之前,需要對所有權重邊做從小到大排序。將排序好的權重邊依次加入到最小生成樹中,如果加入時產生迴路就跳過這條邊,加入下一條邊。當所有結點都加入到最小生成樹中之後,就找出了最小生成樹。

演算法描述:克魯斯卡爾演算法需要對圖的邊進行訪問,所以克魯斯卡爾演算法的時間複雜度只和邊又關係,可以證明其時間複雜度為o(eloge)。

演算法過程:

1.將圖各邊按照權值進行排序

2.將圖遍歷一次,找出權值最小的邊,(條件:此次找出的邊不能和已加入最小生成樹集合的邊構成環),若符合條件,則加入最小生成樹的集合中。不符合條件則繼續遍歷圖,尋找下乙個最小權值的邊。

3.遞迴重複步驟1,直到找出n-1條邊為止(設圖有n個結點,則最小生成樹的邊數應為n-1條),演算法結束。得到的就是此圖的最小生成樹。

克魯斯卡爾(kruskal)演算法因為只與邊相關,則適合求稀疏圖的最小生成樹。而prime演算法因為只與頂點有關,所以適合求稠密圖的最小生成樹。

無疑,kruskal演算法在效率上要比prim演算法快,因為kruskal只需要對權重邊做一次排序,而prim演算法則需要做多次排序。儘管prim演算法每次做的演算法涉及的權重邊不一定會涵蓋連通圖中的所有邊,但是隨著所使用的排序演算法的效率的提高,kruskal演算法和prim演算法之間的差異將會清晰的顯性出來。

最小生成樹 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 ...

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

prim演算法 演算法簡單描述 1 輸入 乙個加權連通圖,其中頂點集合為v,邊集合為e 2 初始化 vnew 其中x為集合v中的任一節點 起始點 enew 為空 3 重複下列操作,直到vnew v a.在集合e中選取權值最小的邊,其中u為集合vnew中的元素,而v不在vnew集合當中,並且v v 如...