邻接矩阵 最小生成树 普里姆算法

//风雨难洗心痕,沧桑不灭情伤。莫要轻言亘古,离散才看荒凉。


#include "stdio.h"
typedef char Vertextype;  //顶点
typedef int EdgeType;  //边的权值
#define MAXVEX 100
#define INFINITY 65535


//邻接矩阵
typedef struct
{
Vertextype vexs[MAXVEX];  //顶点表
EdgeType arc[MAXVEX][MAXVEX];//邻接矩阵,可以看做边表
int numvertexes, numEdges;  //当前的顶点和边数
}MGraph;






//普里姆算法最小生成树
void MinSpanTree_Prim(MGraph G)
{
int min, i, j, k;
int adjvex[MAXVEX];//用来保存相关顶点下标
int lowcost[MAXVEX];//用来保存相关顶点间的权值
lowcost[0] = 0;//初始化第一个权值为0,即v0加入生成树。lowcost的值为0,在这里就是此下标的顶点已经加入生成树
adjvex[0] = 0;//初始化第一个顶点下标为0
for ( i = 1; i < G.numvertexes; i++)//循环除了下标为0外的全部顶点
{
lowcost[i] = G.arc[0][i];//将v0顶点与之有点的权值存入数组
adjvex[i] = 0;//初始化都为v0的下标
}
for ( i = 1; i <G.numvertexes; i++)
{
min = INFINITY;
j = 1; 
k = 0;
while (j < G.numvertexes)//循环全部顶点
{
if (lowcost[j] != 0 && lowcost[j] < min)
{
min = lowcost[j];
k = j;  //将当前最小值的下标存入k
}
j++;
}
printf("(%d,%d)",adjvex[k],k);//打印当前顶点边中权值最小边
lowcost[k] = 0;//将当前顶点的权值设置为0,表示此顶点已经完成任务
for ( j = 1; j < G.numvertexes; j++)//循环所有顶点
{
if (lowcost[j] != 0 && G.arc[k][j] < lowcost[j])
{
lowcost[j] = G.arc[k][j];
adjvex[j] = k;//将下标为k的顶点存入adjvex
}
}
}
}
发布了29 篇原创文章 · 获赞 9 · 访问量 3万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章