資料結構 最小生成樹

2021-09-29 18:20:09 字數 1536 閱讀 6922

『  對於乙個圖連通圖g,n個點,e條邊,最小生成樹就是n-1條邊圖的生成子圖,且這n-1條邊的權值和最小。

對於乙個圖的兩種演算法:prim演算法和kruskal演算法,這兩種演算法都是基於貪心思想的。

偽**實現:

輔助變數:lowcost陣列,儲存當前可連通的其他節點的最小權值。cnt=0表示當前樹連線節點的個數(或者可以儲存邊的個數,n-1條時即樹生成完畢)。

1)找乙個頂點,作為第乙個新節點 cnt++

2)更新lowcost陣列,並將新節點lowcost置零。

3)在lowcost陣列中尋找到 未連線的其他節點權值最小的的點,作為新節點(增點 cnt++)。如果cnt!=n,當前節點返回步驟2)。

例題鏈結

#include

#include

#include

#include

using

namespace std;

class

graph

graph

(int e,

int n):e

(e),

n(n)}}

void

prim()

;};void graph::

prim()

} cout<" ";

cnt++

; lowcost[tmp]=0

;for

(int i=

1;i<=e;i++)}

}int

main()

總結:prim演算法主要適用於圖是用鄰接矩陣來儲存時。複雜度o(n*n)

思想:一開始將所有點分離,即刪除所有的邊,通過增加邊來構成樹。

偽**實現:

輔助需要:並查集,判斷兩點是否連通,決定是否增加兩點之間的邊,最終實現所有點連通。

1)將所有的邊按權值進行排序

2)從權值大到小進行遍歷邊,對於一條邊,如果兩端點所在的連通塊不連通,增加該條邊。

例題鏈結

#include

#include

#include

#include

using

namespace std;

int parent[

200001];

struct node

}a[200001];

intgetr

(int x)

intmain()

for(

int i=

1;i<=n;i++

) parent[i]

=i;sort

(a+1

,a+1

+n);

for(

int i=

1;i<=n;i++)}

if(cntelse cout<}

總結:kruskal 演算法由於遞迴實現尋找根的同時將路徑壓縮,極大地降低了複雜度。總的複雜度只有mlog(m).

資料結構 最小生成樹

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

資料結構(最小生成樹)

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

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

生成樹 指的是乙個包含了g的所有頂點的樹。生成樹是g的乙個極小連通的子圖。從g的任意頂點出發,做一次深度 廣度優先遍歷,訪問g中的n個頂點,並將順次訪問的兩個頂點之間的路徑記錄,經歷的n條邊就構成了g的極小連通子圖,也就是g的一棵生成樹。對於深度優先 dfs 和廣度優先 bfs 只要在if語句中加入...