最小生成樹

2021-08-23 12:01:06 字數 2179 閱讀 4614

目錄

一、定義

二、普里姆演算法—prim演算法(適合稠密圖)

三、克魯斯卡演算法—kruskal演算法(適合稀疏圖)

給定乙個無向圖,如果他的某個子圖中,任意兩個頂點都能互相連通並且是一棵樹,那麼這棵樹就叫做生成樹,如果邊上有權值,那麼使得邊權和最小的生成樹叫做最小生成樹。

實際問題:我們要在n個城市中建立乙個通訊網路,則連通這n個城市需要布置n-1一條通訊線路,這個時候我們需要考慮如何在成本最低的情況下建立這個通訊網? 

用堆優化後時間複雜度:o((n+m)logm)

【演算法思想】

prime演算法是一種貪心演算法,它最初將無向連通圖g中所有頂點v分成兩個頂點集合va和vb。在計算過程中va中的點為已經選好連線入生成樹的點,否則屬於vb。最開始的時候va只包含任意選取的圖g中的乙個點u,其餘的點屬於vb,每次新增乙個vb中的點到va,該點是集合vb到集合va中距離最小的乙個點。直到v個頂點全部屬於va,演算法結束。顯然出發點不同,最小生成樹的形態就不同,但邊權和的最小值是唯一的。

下面我們對下面這幅圖求其最小生成樹:

假設我們從頂點v1開始,所以我們可以發現(v1,v3)邊的權重最小,所以第乙個輸出的邊就是:v1—v3=1: 

然後,我們要從v1和v3作為起點的邊中尋找權重最小的邊,首先了(v1,v3)已經訪問過了,所以我們從其他邊中尋找,發現(v3,v6)這條邊最小,所以輸出邊就是:v3—-v6=4 

然後,我們要從v1、v3、v6這三個點相關聯的邊中尋找一條權重最小的邊,我們可以發現邊(v6,v4)權重最小,所以輸出邊就是:v6—-v4=2. 

然後,我們就從v1、v3、v6、v4這四個頂點相關聯的邊中尋找權重最小的邊,發現邊(v3,v2)的權重最小,所以輸出邊:v3—–v2=5 

然後,我們就從v1、v3、v6、v4,v2這2五個頂點相關聯的邊中尋找權重最小的邊,發現邊(v2,v5)的權重最小,所以輸出邊:v2—–v5=3 

最後,我們發現六個點都已經加入到集合u了,我們的最小生成樹建立完成。

【演算法步驟】

選定圖中的任意乙個頂點v0,從v0開始生成最小生成樹。

(1)初始化dist[v0]=0,其他點的距離值dist[i]=∞。其中dist[i]表示集合vb中的點到va中的點的距離值。

(2)經過n次如下步驟操作,最後得到一棵含n個頂點,n-1條邊的最小生成樹:

①選擇乙個未標記的點k,並且dist[k]的值是最小的

②標記點k進入集合va

③以k為中間點,修改未標記點j,即vb中的點到va的距離值

(3)得到最小生成樹t。

【**】

#includeusing namespace std;

const int maxn=105;

const int inf=0x7fffffff/2;

int vis[maxn];//判斷是否標記

int p[maxn][maxn];//存圖

int n,m,ans=0;

struct edge//儲存邊的情況,to為通往的邊

}now;

priority_queueq;

void prim(int key)

a[maxn];

bool cmp(edge a,edge b)

int find1(int x)

return r;

}void kruskal()

}if(k

}int main()

最小生成樹 次小生成樹

一 最小生成樹 說到生成樹首先要解釋一下樹,樹是乙個聯通的無向無環圖,多棵樹的集合則被稱為森林。因此,樹具有許多性質 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...