Prim算法求最小生成树

普里姆算法求最小生成树

算法完整代码展示:

void Prim(MatGraph g,int v)
{
	int lowcost[MAXV],min,n=g.n;
	int closest[MAXV],i,j,k;
	for (i=0;i<n;i++)          	//给lowcost[]和closest[]置初值
	{	
		lowcost[i]=g.edges[v][i];
		closest[i]=v;
	}
	for (i=1;i<n;i++)          	//找出n-1个顶点
	{   
		min=INF;
	    for (j=0;j<n;j++)       //在(V-U)中找出离U最近的顶点k
		   	if (lowcost[j]!=0 && lowcost[j]<min) 
			{	
				min=lowcost[j]; k=j;  
			}
		printf("  边(%d,%d)权为:%d\n",closest[k],k,min);
		lowcost[k]=0;         	//标记k已经加入U
		for (j=0;j<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 Prim(MatGraph g,int v)		//g为临接矩阵形式的图,v为根节点
{
	int lowcost[MAXV],min,n=g.n;
	//	最短边集合	最短长度  图中结点数
	int closest[MAXV],i,j,k;
	//	最近的结点	计数器i,j	k中间转换变量
	
	for (i=0;i<n;i++)          	//给lowcost[]和closest[]置初值——就是将所有结点与仅含v的V集合联系在一起
	{	
		lowcost[i]=g.edges[v][i];		//只有v在V集合内,所有U-V集合到V集合的最短距离是到v的边长度
		closest[i]=v;					//所有点到V的最近的结点也只有v了
	}
	
	for (i=1;i<n;i++)          	//找出n-1个顶点
	{   
		min=INF;				//将最短长度置为INF
		
	    for (j=0;j<n;j++)       //在(U-V)中找出离V最近的顶点k
		   	if (lowcost[j]!=0 && lowcost[j]<min) 
			{	
				min=lowcost[j]; k=j;  
			}
			
		printf("  边(%d,%d)权为:%d\n",closest[k],k,min);
		lowcost[k]=0;         	//标记k已经加入V
		
		for (j=0;j<n;j++)   	//修改数组lowcost和closest
           	if (g.edges[k][j]!=0 && g.edges[k][j]<lowcost[j]) 
           						//这一步是以U-V中的元素为主体,
           						//如果它到K的长度能小于原来到V的长度,就用到K的长度替换到原来V的长度
			{	
				lowcost[j]=g.edges[k][j];
				closest[j]=k; 
			}
	}
}

你可能感兴趣的:(数据结构,C语言,数据结构,算法,算法导论)