【圖】Prim算法簡述

本文給出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);			//輸出最小權值和	 
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章