最小生成樹

2022-05-01 00:57:14 字數 2654 閱讀 5400

generalliu

最小生成樹

就是在乙個 n 個點的連通圖里

取 n-1 條邊

使 n 個點 連通

並且 這 n-1 條邊 的和 最小

如 紅邊 是 最小生成樹

最小生成樹 主要就是通過 下面的兩種方法

prim演算法 和 kruskal演算法 來解決

然後  這兩種演算法 採用的思路 不同

但是  到達同樣的 結果

具體選擇  

可以根據題目的 特點 或者 個人喜好

我個人覺得 k演算法 寫起來很爽

但理性地講 

p演算法 的複雜度 主要取決於 節點數

k演算法 的複雜度 主要取決於    邊數

所以 當點一樣多時 比較稀疏(邊少)的圖 用 k演算法

比較稠密(邊多)的圖 用 p演算法

kruskal演算法

兩步就能解決的

相當容易理解的

個人情有獨鍾的

k演算法兩步

既然最小生成樹 一定要取 n-1 條邊

那麼 取邊的時候 就 能小則小 嘍

所以  第一步  

將所有的邊 按邊權 從小到大排序

過第二步

選邊的時候 很明顯地 「 選前 n-1 條邊」 是錯的

所以 從小到大 能選則選 直到選了 n-1 條為止

第二步過

簡單的要死

注釋所謂 「能選則選」 :

因為 最小生成樹 是樹 是沒有環的

所以 選邊的時候也不能出現 環

每次成功 選出一條邊 就把 邊連線的兩個連通塊 合併

所謂 「 成功 選出 」:

該邊的 兩個端點 不在同一連通塊裡

如果在同乙個連通塊裡 就成環了

**

#include using

namespace

std;

const

int maxn=100000+15

;const

int maxm=100000+15

;struct

edge

edge[maxm];

intn,m,tot;

//由小到大

bool

cmp(edge a,edge b)

inttop[maxn];

//判斷連通塊 的 時候 用到了 並查集

int found(int

x)

intmain()

sort(edge+1,edge+m+1,cmp); //

第一步 排序

for (int i=1;i<=n;i++) top[i]=i; //

初始化 連通塊

int ans=0

;

for (int i=1;tot;i++)

}printf(

"%d\n

",ans);

return0;

}

view code

prim演算法

先選取乙個 藍點

然後不斷 把白點 加入藍點 的乙個過程

1 初始化  v』=  e』={}  v'是藍點

x是隨便乙個節點

2 重複下列操作   直到v』=v

在e集合當中  選擇最小的邊

使得 u∈v』   但是  v∉v』     u是藍點 v是白點

v』 中加入節點 v    e』 中加入

3 (v』,e』)則為所求的最小生成樹。

分析1    中 的 x 隨便 乙個點 即可

2    一直 選最小的 連線 v' 與 !v』 的 邊

這一步可用 heap 堆 (優先佇列) 優化

維護乙個   u∈v』  但是  v∉v』  的邊集

就能 迅速取出 滿足要求 的邊

**

#include using

namespace

std;

const

int maxn=100000+15

;const

int maxm=100000+15

;struct

edge

}edge[maxm*2

];const

bool

operator

< (const edge &a,const edge &b)//

定義 小根堆

intn,m;

intsumedge,head[maxn];

int ins(int x,int y,int

z)priority_queue

que;

intans;

bool

boo[maxn];

intmain()

memset(boo,

false,sizeof(boo)); //

初始 全為 白點

boo[1]=true; //

1 置為藍點

for (int u=head[1];u;u=edge[u].next) que.push(edge[u]);//

堆中加邊

for (int i=1;i//

總共要取出 n-1 條邊

printf(

"%d\n

",ans);

return0;

}

view code

最小生成樹 次小生成樹

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