最小生成樹演算法 普里姆Prim演算法

2021-06-16 15:27:43 字數 2038 閱讀 1502

** 

1. 鄰接矩陣儲存

[cpp]view plain

copy

//圖的鄰接矩陣儲存表示

#define infinity int_max

#define max_vertex_num 20

typedef

enum

graphkind; 

//typedef

enum

status;  

typedef

struct

arccellarccell, adjmatrix;  

typedef

struct

mgraph;  

bool

visited[max_vertex_num];   

//設訪問標誌陣列,供遍歷時使用

[cpp]view plain

copy

//prim演算法-記錄從頂點集u到v-u的代價最小的邊的輔助陣列定義

struct

closedge[max_vertex_num];  

2. prim演算法

[cpp]view plain

copy

void

minispantree_prim(mgraph g, 

intu)  

closedge[max_vertex_num];

inti,j,k;  

for(j=0; j//輔助陣列初始化

if(j!=u)  

closedge[u].lowcost = 0;        //初始化u=

for(i=0; i

//if

if(k <0)  

return

;  cout<"——"

<" : "

closedge[k].lowcost = 0;                    //第k頂點併入u集

for(j=0; j

if(g.arcs[k][j].adj < closedge[j].lowcost)   

//新頂點併入u後,重新選擇最小邊

}  }//minispantree_prim

3. 構造乙個測試用的無向網

[cpp]view plain

copy

void

createudntest(mgraph &g)  

, , ,  

, , , , ,

,

};

g.kind = udn;

g.vexnum = 6;

g.arcnum = 10;

for

(i=0; i//構造頂點向量

g.vexs[i] = i;

for

(i=0; i//初始化為全int_max

for

(j=0; j

for

(i=0; i//對存在的邊賦值

g.arcs[a[i][0]][a[i][1]].adj = g.arcs[a[i][1]][a[i][0]].adj = a[i][2];

}

4.主函式

[cpp]view plain

copy

intmain()    

最小生成樹 普里姆演算法 Prim

最小生成樹 的7到12行先初始化了矩陣第一行的值,本來很奇怪,那其他行的值怎麼辦?看到最後的28 35行才知道,原來從下面開始會逐步初始化與上個頂點相關的邊的值,最後能夠把全部都初始化了。截圖如下 演算法定義 1 輸入 乙個加權連通圖,其中頂點集合為v,邊集合為e 2 初始化 v new 其中x為集...

最小生成樹之Prim(普里姆)演算法

關於什麼是prim 普里姆演算法 在實際生活中,我們經常碰到類似這樣的一類問題 假設要在n個城市之間建立通訊聯絡網,則連通n個城市只需要n 1條線路。這時,我們需要考慮這樣乙個問題,如何在最節省經費前提 下建立這個通訊網.換句話說,我們需要在這n個城市中找出乙個包含所有城市的連通子圖,使得 其所有邊...

最小生成樹之普里姆 Prim 演算法

prim 演算法是一種貪心演算法 適合稠密圖 設g v,e 是無向連通帶權圖,v 設最小生成樹 t u,e 演算法結束時 u v,e e。貪心選擇的思想是 每次對於還未加入到 u 中 即 v u 中 所有點頂,從這些頂點中選擇乙個頂點,選擇的標準是,它距離 u 最近 和 u 中某個頂點的權值最小 將...