本文給出Prim算法描述及核心代碼。
- Prim算法思想簡述:
Prim算法通過一系列不斷擴張的子樹來構造一顆最小生成樹。我們從圖的頂點集合V中任意選擇一個單頂點,作爲序列中的初始子樹。每一次迭代時,以一種貪婪的方式來苦熬張當前樹,即簡單的把不在樹中的最近頂點添加到樹中。當圖中所有頂點都包含在所構造的樹中以後,該算法就停止了。因爲在每次迭代時,該算法只對樹擴展一個頂點,這種迭代的總次數爲n-1,其中n是圖中樹的頂點個數。對樹進行擴展時用到的邊的集合用來表示該算法的生成樹。
- 代碼實現:
//prim
typedef struct{
int adjvex; //最小邊在集合u
int lowcost; //最小邊上權值
}closedge;
closedge C[maxsize];
void Prim(Graph G){
int v=0; //初始節點
int minsumcost=0; //記錄最小生成樹的各邊權值之和
int n=G.vexnum;
//初始化
for(int i=0;i<n;i++){
C[i].adjvex=v;
C[i].lowcost=G.Edge[v][i];
}
//進入餘下循環
for(int i=1;i<n;i++){
int k,min=INF;
for(int j=0;j<G.vexnum;j++){
if(C[j].lowcost!=0&&C[j].lowcost<INF){
C[j].lowcost=k;
k=j;
}
}
minsumcost+=C[j].lowcost; //累加權值
for(int j=0;j<n;j++){ //更新最小邊
if(C[j].lowcost!=0&&G.Edge[k][j]<C[j].lowcost){
C[j].lowcost=G.Edgw[k][j];
C[j].adjvex=k;
}
}
//printf("%d",minsumcost); //輸出最小權值和
}