prime算法求最小生成图

1.代码

#include
#include 
# define MAX_VEX 100

//以数字代替顶点
//创建邻接矩阵 
int create(int cost[][MAX_VEX])
{
	int i, j, v1, v2, w, vexnum, edgnum;
	printf("输入顶点数和边数: ");//确定数值有助于节省空间,方便代码书写
	scanf("%d, %d", &vexnum, &edgnum); 
	
	//初始化,32767代表无穷 
	for(i=1; i<=vexnum; i++)
		for(j=1; j<=vexnum; j++)
		cost[i][j]=31767; 
	printf("依次输入v1、v2及其权值w并以,隔开\n");	
	for(i=1;i<=edgnum;i++)
	{
		scanf(" %d, %d, %d",&v1,&v2,&w);//v1!=v2
		cost[v1][v2]=w;
		//建立无序图,加上以下一句
		cost[v2][v1]=w;	 
	}
	return vexnum;	
	
} 
//prim算法求最小生成树 
void prim(int cost[][MAX_VEX], int vexnum)
{
	//从第k个顶点开始
	int i, j, k, bvex, min, locmin;
	//
	int lowcost[vexnum+1], closevext[vexnum+1];
	printf("prim算法最小生成树\n输入开始节点: ");
	scanf("%d", &bvex);
	//lowcost用于存储vexnum个权值,以便找出最小者 
	for(k=1;k<=vexnum;k++)
	{
		lowcost[k]=cost[bvex][k];
		closevext[k]=bvex;						//默认为起始节点 
	}
	closevext[bvex]=-1;//选入集合U 	
	for(i=1;i<=vexnum;i++)
	{
		locmin=0, min=31767;
		//1,不在U内; 2,权值最小 
		for(j=1;j<=vexnum;j++)		
			//定位V中距离U最近的顶点locmin 
			if(closevext[j]!=-1&&lowcost[j]<min)
			{
				min=lowcost[j];
				locmin=j;		
			}
		if(locmin)
		{
			printf("(%d,%d)%2d\n", closevext[locmin], locmin, min );
			closevext[locmin]=-1;//顶点locmin加入集合U 	
			//由于locmin的加入, 可能需要修改数组lowcost 
			for(k=1;k<=vexnum;k++)				
				if(closevext[k]!=-1&&cost[locmin][k]<lowcost[k])
				{
					lowcost[k]=cost[locmin][k];
					closevext[k]=locmin;		//默认节点的修改,影响输出语句 
				}				
		}		
		
	}	
} 
int main()
{
	int cost[MAX_VEX][MAX_VEX];
	int vexnum=create(cost);
	prim(cost, vexnum);
 	return 0;
}

2.结果

猜你喜欢

转载自blog.csdn.net/lituusliu/article/details/77960230