最小生成樹

2021-10-09 20:18:51 字數 2888 閱讀 1488

一、基本概念

1、生成樹定義:在乙個|v|個點的無向連通圖中,取|v|-1條邊,並連線所有的頂點,所得到的子圖為原圖的一顆生成樹。

2、數的屬性:樹是圖的一種特殊形態。圖g是樹當且僅當以下任意乙個條件成立:

① g有 |v| - 1 條邊,無環;

② g有 |v| - 1 條邊,連通;

③ 任意兩點之間只有唯一的簡單路徑;

④ g連通,但任意刪除一條邊後就不連通。

3、最小生成樹:在乙個帶權的無向連通圖中,各邊權和最小一顆生成樹即為原圖的最小生成樹。

4、最小邊原則:圖中權值最小的邊(如果唯一的話)一定在最小生成樹上。

5、唯一性定理:對於乙個圖 g ,如果圖中的邊權值都不相同,則圖的最小生成樹唯一。

二、計算無向圖的最小生成樹的兩種演算法

【prim演算法】

※演算法思想※

prime演算法是一種貪心演算法,它最初將無向圖g中所有頂點 v 分成兩個頂點集合 v

av_a

va​ 和 v

bv_b

vb​。在計算過程中 v

av_a

va​ 中的點為已選好鏈結入生成樹的點,否則屬於 v

bv_b

vb​。最開始時 v

av_a

va​ 值包含任意選取的圖g中的乙個點 u,其餘點屬於 v

bv_b

vb​ ,每次新增乙個 v

bv_b

vb​ 中的點到 v

av_a

va​ ,該點是集合 v

bv_b

vb​ 到 v

av_a

va​ 中距離最小的乙個點。直到 v 個頂點全部屬於 v

av_a

va​,演算法借書。顯然出發點不同,最小生成樹的形態就不同,但邊權和的最小值是唯一的。

※演算法步驟※

選定圖中的任意乙個頂點 v

0v_0

v0​ ,從 v

0v_0

v0​ 開始生成最小生成樹;

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

bv_b

vb​ 中的點到 v

av_a

va​中的點的距離。

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

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

②標記點 k 進入集合 v

av_a

va​;

③以 k 為中間點,修改未標記點 j ,即v

bv_b

vb​中點到v

av_a

va​的距離值;

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

任意時刻的連邊狀態都是一棵樹;從某乙個點開始,每次都花費最小的代價,用一條邊加進乙個新的點。

※演算法實現※

//時間複雜度為o(n),優化需要使用堆來優化求最小生成樹的n-1條邊

#include

#include

#include

#include

using

namespace std;

#define ll long long

#define inf 0x3f3f3f3f

const

int n =

1e4+10;

//vis表示是否加入樹,d表示點與當前生成樹中的點有連邊的邊長最小值

int vis[n]

,d[n]

,g[n]

[n];

int n,m,ans=0;

void

read()

}void

prim

(int v)

} vis[k]=1

; ans +

= d[k]

;for

(int j=

1;j<=n;j++)if

(vis[j]==0

&&d[j]

>g[k]

[j])

d[j]

= g[k]

[j];}}

intmain()

【kruskal演算法】

※演算法思想※

kruskal演算法也是一種貪心演算法,它是將邊按照權值排序,每次從剩餘的邊集中選擇權值最小且兩個端點不在同一集合的邊加入生成樹中,反覆操作,直到加入了n-1條邊。

※演算法步驟※

將圖g中的邊按照權值從小到大進行快排。

按照權值從小到大以此選邊。

重複2的操作直到生成樹中包含 n-1 條邊。否則遍歷完所有邊後,選取不到 n-1 條邊,則最小生成樹不存在。

※演算法實現※

#include

#include

#include

#include

using

namespace std;

#define ll long long

#define inf 0x3f3f3f3f

const

int n =

1e5+10;

struct edgea[n]

;int n,m,prt[n]

,ans=

0,bj;

bool

cmp(edge &x,edge &y)

intgetfather

(int x)

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...