最小生成樹

2022-09-18 17:21:12 字數 1903 閱讀 4709

一、n個頂點的連通網路的最小生成樹生成樹有n個頂點,n-1條邊

構造準則:

- 盡可能使用網路中權值最小的邊;

- 必須使用且僅使用n-1條邊來連線網路中的n個頂點;

- 不能使用產生迴路的邊。

二、演算法

1、prim演算法

演算法思想:

從連通網路n= 中的某乙個頂點u0出發,選擇與它關聯的具有最小權值的邊(u0,v),將其頂點加入到生成樹的頂點集合u中。

以後每一步從乙個頂點在u中,而另乙個頂點不在u中的各條邊種選擇邊權值最小的邊(u,v),把改變加入到生成樹的邊集te中,把它的頂點加入到集合u中。如此重複執行,直到網路中所有頂點都加入到生成樹頂點集合u中為止。

進一步描述:

(1)在連通網的頂點集合v中,任選乙個頂點,構成最小生成樹的初始頂點集合u;

(2)在u和v-u 中各選乙個頂點,使得該邊的權值最小,把該邊加入到最小生成樹的邊集te中,同時將v-u中的該頂點併入到u中;

(3)反覆執行第(2)步,直至v-u=ø為止。

設定乙個輔助陣列closedge:

- lowcost域   存放生成樹頂點集合內頂點到生成樹外各頂點的各邊上的當前最小的權值;

- adjvex域  記錄生成樹頂點集合外各頂點距離結合內哪個頂點最近(即權值最小)。

例子:

adjvex[v]為-1,表示它已經加入生成樹頂點集合。

將邊(adjvex[v], v, lowcost[v]) 加入生成樹的邊集合

取lowcost[i] = min, 即用生成樹頂點集合外個頂點i到剛加入該集合的新頂點v的距離edge[v][i]與原來他們到生成樹頂點集合中頂點的最短距離lowcost[i]做比較,取距離近的作為這些集合外頂點到生成樹頂點集合內頂點的最短距離。

如果生成樹頂點集合外頂點i到剛加入該集合的新頂點v的距離比原來它到生成樹頂點集合中最短距離

還要近,則修改adjvex[i]:adjvex[i]=v. 表示生成樹外頂點i到生成樹內頂點v當前距離最近。

演算法:

void prim(graph g, mst& t,int u)

, 最初先構造乙個只有n個頂點,沒有邊的非連通圖t=,圖中每個頂點自成乙個連通分量。當在e中選到一條具有最小權值的邊時,若改變的兩個頂點落在不同的連通分量上,則將此邊加入到t中;否則將此邊捨去,重新選擇一條權值最小的邊,如此重複下去,直到所有頂點在同乙個連通分量上為止。

最小生成樹 次小生成樹

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