資料結構 生成樹和最小生成樹

2021-10-07 17:18:43 字數 1769 閱讀 4161

生成樹:指的是乙個包含了g的所有頂點的樹。生成樹是g的乙個極小連通的子圖。從g的任意頂點出發,做一次深度/廣度優先遍歷,訪問g中的n個頂點,並將順次訪問的兩個頂點之間的路徑記錄,經歷的n條邊就構成了g的極小連通子圖,也就是g的一棵生成樹。

對於深度優先(dfs)和廣度優先(bfs),只要在if語句中加入將(vi,vj)列印出來的語句,就構成生成樹演算法。

用乙個連通網路來構造生成樹時,可以得到乙個帶權的生成樹,把生成樹各邊的權值總和作為生成樹的權,具有最小權值的生成樹構成了最小生成樹

構造最小生成樹,就是在給定n個頂點對於的權矩陣條件下,給出代價最小的生成樹。

mst性質:假設g=(v,e)是乙個連通網路,u是v中的乙個子集,若存在頂點u屬於u和v屬於v-u的邊(u,v)是一條具有最小權的邊,則必存在g的一棵最小生成樹包括這條邊(u,v)。

非常拗口!多理解幾遍。

看到教材上這張圖,感覺會比較好理解。

根據mst性質,構造最小生成樹有兩種常用演算法。

演算法梗概:

1、選乙個任意頂點t,置初始候選邊集

圖上真的好清楚啊!

//儲存結構

typedef

struct

edge;

float dist[n]

[n];

//n個頂點的帶權鄰接矩陣

edge t[n-1]

;//生成樹

//prim演算法

void

prim

(int i)

else

}for

(k=0

;k1;k++)}

e=t[m]

; t[m]

=t[k]

; t[k]

=e;//交換 將最短的邊交換到t[k]

v=t[k]

.endvex;

//v中存放新找到的最短邊在v-u中的頂點

//儲存結構

typedef

struct

edge;

edge g_t[e]

;//e為圖中的邊數

int g_g[n]

;//判斷該邊的兩個頂點是否在同乙個分量上的陣列中

//kruskal演算法

void

kruskal

(int n,

int e)

for(i=

0;i<=e-

1;i++

) j=0;

while

(j}}

g_t[minedge]

.sign=1;

if(g_g[k]

==g_g[l]

) g_t[i]

.sign=2;

//說明在同乙個分量上,會形成迴路,捨去

else}}

}

資料結構 最小生成樹

生成樹 乙個連通圖的最小連通子圖稱作該圖的生成樹。有n個結點的連通圖的生成樹有n個結點和n 1條邊。乙個有n個結點的連通圖的生成樹是原圖的極小連通子圖,它包含原圖中的所有n個結點,並且有保持圖連通的最少的邊。由生成樹的定義可知 若在生成樹中刪除一條邊,就會使該生成樹因變成非連通圖而不再滿足生成樹的定...

資料結構(最小生成樹)

對於乙個無相連通網,他的所有生成樹中必有一棵邊的權值總和最小的生成樹,稱之為最小代價生成樹,簡稱最小生成樹。最小生成樹必須滿足三個條件 1 構造的最小生成樹必須包括n個頂點 2 構造的最小生成樹有且僅有n 1條邊 3 構造的最小生成樹中不存在迴路。普利姆演算法 prim 假設g v,e 為一無向連通...

資料結構 最小生成樹

對於乙個圖連通圖g,n個點,e條邊,最小生成樹就是n 1條邊圖的生成子圖,且這n 1條邊的權值和最小。對於乙個圖的兩種演算法 prim演算法和kruskal演算法,這兩種演算法都是基於貪心思想的。偽 實現 輔助變數 lowcost陣列,儲存當前可連通的其他節點的最小權值。cnt 0表示當前樹連線節點...