『 對於乙個圖連通圖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語句中加入...