最小生成樹算法-普里姆(prim)算法

prime算法實現

#include <stdio.h>
#define MAXV 20			//最多頂點數
#define INF 32767       //INF表示∞
typedef char InfoType;
typedef struct 
{  	
	int no;						//頂點編號
	InfoType info;				//頂點其他信息
} VertexType;					//頂點類型
typedef struct  				//圖的定義
{  	
	int edges[MAXV][MAXV]; 		//鄰接矩陣
   	int n,e;   					//頂點數,弧數
	VertexType vexs[MAXV];		//存放頂點信息
} MGraph;						//圖的鄰接矩陣類型

void Prim(MGraph g,int v)
{
	int lowcost[MAXV];			//頂點i是否在U中
	int min;
	int closest[MAXV],i,j,k;
	for (i=0;i<g.n;i++)          	//給lowcost[]和closest[]置初值
	{	
		lowcost[i]=g.edges[v][i];
		closest[i]=v;
	}
	for (i=1;i<g.n;i++)          	//找出n-1個頂點
	{
		min=INF;
		for (j=0;j<g.n;j++)       //在(V-U)中找出離U最近的頂點k
			if (lowcost[j]!=0 && lowcost[j]<min) 
			{
				min=lowcost[j];
				k=j;			//k記錄最近頂點的編號
			}
		printf(" 邊(%d,%d)權爲:%d\n",closest[k],k,min);
		lowcost[k]=0;         	//標記k已經加入U
		for (j=0;j<g.n;j++)   	//修改數組lowcost和closest
			if (g.edges[k][j]!=0 && g.edges[k][j]<lowcost[j]) 
			{
				lowcost[j]=g.edges[k][j];
				closest[j]=k; 
			}
	}
}
void main()
{
	int i,j;
	MGraph g;
	g.n=6;g.e=20;
	int a[6][MAXV]={
		{0,6,1,5,INF,INF},
		{6,0,5,INF,3,INF},
		{1,5,0,5,6,4},
		{5,INF,5,0,INF,2},
		{INF,3,6,INF,0,6},
		{INF,INF,4,2,6,0}};
	for (i=0;i<g.n;i++)		//建立圖9.13(a)所示的圖的鄰接矩陣
		for (j=0;j<g.n;j++)
			g.edges[i][j]=a[i][j];
	printf("最小生成樹構成:\n");
	Prim(g,0);
	printf("\n");
}

 

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