普里姆Prim演算法介紹

2021-09-07 16:57:46 字數 2395 閱讀 4089

普里姆(prim)演算法,和克魯斯卡爾演算法一樣,是用來求加權連通圖的最小生成樹的演算法。

基本思想

對於圖g而言,v是所有頂點的集合;現在,設定兩個新的集合u和t,其中u用於存放g的最小生成樹中的頂點,t存放g的最小生成樹中的邊。 從所有uєu,vє(v-u) (v-u表示出去u的所有頂點)的邊中選取權值最小的邊(u, v),將頂點v加入集合u中,將邊(u, v)加入集合t中,如此不斷重複,直到u=v為止,最小生成樹構造完畢,這時集合t中包含了最小生成樹中的所有邊。

以上圖g4為例,來對普里姆進行演示(從第乙個頂點a開始通過普里姆演算法生成最小生成樹)。

初始狀態:v是所有頂點的集合,即v=;u和t都是空! 

第1步:將頂點a加入到u中。 

此時,u=。 

第2步:將頂點b加入到u中。 

上一步操作之後,u=, v-u=;因此,邊(a,b)的權值最小。將頂點b新增到u中;此時,u=。 

第3步:將頂點f加入到u中。 

上一步操作之後,u=, v-u=;因此,邊(b,f)的權值最小。將頂點f新增到u中;此時,u=。 

第4步:將頂點e加入到u中。 

上一步操作之後,u=, v-u=;因此,邊(f,e)的權值最小。將頂點e新增到u中;此時,u=。 

第5步:將頂點d加入到u中。 

上一步操作之後,u=, v-u=;因此,邊(e,d)的權值最小。將頂點d新增到u中;此時,u=。 

第6步:將頂點c加入到u中。 

上一步操作之後,u=, v-u=;因此,邊(d,c)的權值最小。將頂點c新增到u中;此時,u=。 

第7步:將頂點g加入到u中。 

上一步操作之後,u=, v-u=;因此,邊(e,g)的權值最小。將頂點g新增到u中;此時,u=v。

此時,最小生成樹構造完成!它包括的頂點依次是:a b f e d c g

以"鄰接矩陣"為例對普里姆演算法進行說明,對於"鄰接表"實現的圖在後面會給出相應的原始碼。

1. 基本定義

//鄰接矩陣

typedef struct_graph

graph, *pgraph; //邊的結構體 typedef struct_edgedata edata;

graph是鄰接矩陣對應的結構體。 

vexs用於儲存頂點,vexnum是頂點數,edgnum是邊數;matrix則是用於儲存矩陣資訊的二維陣列。例如,matrix[i][j]=1,則表示"頂點i(即vexs[i])"和"頂點j(即vexs[j])"是鄰接點;matrix[i][j]=0,則表示它們不是鄰接點。 

edata是鄰接矩陣邊對應的結構體。

2. 普里姆演算法

#include#include#include#include

#define max 100

#define inf (~(0x1<<31))typedef structgraph graph,*pgraph; typedef structedgedata edata; static int get_position(graph g,charch) graph*create_graph() ; int matrix[7]=, , , , , , }; int vlen=sizeof(vexs)/sizeof(vexs[0]); inti,j; graph *pg; if((pg=(graph*)malloc(sizeof(graph)))==null) returnnull; memset(pg,0,sizeof(pg)); pg->vexnum=vlen; for(i=0; ivexnum; i++) pg->vexs[i]=vexs[i]; for(i=0; ivexnum; i++) for(j=0; jvexnum; j++) pg->matrix[i][j]=matrix[i][j]; for(i=0; ivexnum; i++) } pg->edgnum/=2; returnpg; } voidprint_graph(graph g) } edata*get_edges(graph g) } } returnedges; } void prim(graph g,intstart) { intmin,i,j,k,m,n,sum; int index=0; char prim[max]; int weight[max]; prim[index++]=g.vexs[start]; for(i=0; i

執行結果:

普里姆(Prim)演算法

普里姆 prim 演算法 網類 template class netgraph 析構函式 void print 列印鄰接矩陣 void minispantree prim prim演算法生成最小生成樹 獲取資料el在頂點表中的位置 template int netgraph getposition ...

演算法之 普里姆(Prim)演算法

普里姆演算法 prim s algorithm 是圖中的一種演算法,可在加權連通圖中搜尋最小生成樹。該演算法的作用就是根據圖中權值找到連線所有頂點的最短路徑,也就是連線所有頂點的最小權值之和,也是這個加權圖中的最小生成樹。1.選取權值最小邊的其中乙個頂點作為起始點。2.找到離當前頂點權值最小的邊,並...

深度學習普里姆演算法(Prim)

如果你對資料結構了解不深,又想要學習普里姆演算法,建議你看看我這篇,我盡量往細緻的方向寫,如果有些大佬認為我寫的比較囉嗦,請見諒,畢竟我的目的是為了讓資料結構小白能夠在理解普里姆演算法上相對容易一些。由於為了清楚地說明普里姆演算法,可能會犧牲一些嚴謹性,但只講嚴謹的術語會加大理解難度,尤其對於非科班...