圖的最小生成樹(普利姆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 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM