圖的最小生成樹(普利姆prim演算法)
阿新 • • 發佈:2018-12-01
什麼是生成樹呢?
一個連通圖的生成樹是指一個極小連通子圖, 它含有圖中的全部頂點,但只有足以構成一棵樹的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 //邊集 9typedef 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 }