1. 程式人生 > >圖的最小生成樹(普利姆prim演算法)

圖的最小生成樹(普利姆prim演算法)

什麼是生成樹呢?

一個連通圖的生成樹是指一個極小連通子圖, 它含有圖中的全部頂點,但只有足以構成一棵樹的n-1條邊。

什麼是最小生成樹?

在一個連通圖的所有生成樹中,各邊的代價之和最小的那棵生成樹稱為該連通圖的最小代價生成樹(MST), 簡稱最小生成樹。

求最小生成樹有兩種演算法,本文講prim演算法。

簡略證明

使用反證法證明

設一棵最小生成樹T不包含最短邊a,將a加入最小生成樹T中,書中必定構成一個包含a的迴路,而回路中必定有邊比a大(因a為最短邊),則刪除比a大的邊得到一棵比原先T更小的樹T1,而T1才是最小生成樹,則與假設矛盾,證明成立。

prim演算法

將樹的所有點劃分為兩個集合U 和 V

每次選一個最小代價的點從V加入U中,然後更新V中的點到U的最小代價,周而復始直到V為空。

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 #define MAX_VERTEX_NUM 20
 4 #define INFINTY 32768
 5 typedef int AdjType;//權值型別
 6 typedef enum{DG, DN, UDG, UDN} GraphKind;
 7 typedef char VertexData;
 8 //邊集
 9
typedef struct ArcNode{ 10 AdjType adj; 11 //Other info 12 }ArcNode; 13 typedef struct{ 14 VertexData vertex[MAX_VERTEX_NUM]; 15 ArcNode arcs[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; 16 int vexnum, arcnum; 17 GraphKind kind; 18 }AdjMatrix; 19 struct{ 20 int adjvex; 21 int lowcost;
22 }closedge[MAX_VEX_NUM]; 23 24 MiniSpanTree_Prim(AdjMatrix gn, int u){ 25 closedge[u].lowcost = 0; 26 for(int i = 0; i< gn.vexnum; i++) //初始化 27 if(i != u){ 28 closedge[i].adjvex = u; 29 closedge[i].lowcost = gn.arcs[u][i].adj; 30 } 31 for(int e = 1; i < = gn.vexnum-1;e++){ 32 int v = Minium(closedge); //the minium cost from V to U 33 int u = closedge[v].adjvex; 34 // printf(); 35 closedge[v].lowcost = 0; //add v to U 36 for(int i = 0; i< gn.vexnum; i++) 37 if(gn.arcs[v][i].adjgn.arcs[v][i].adj < closedge[i].lowcost){ 38 closedge[i].lowcost = gn.arcs[v][i].adj; 39 closedge[i].adjvex = v; 40 } 41 } 42 43 }