仿照数据结构的读书笔记写prim算法的代码,结果运行时却错误,还看不出拿错了,求解!
#define MAXVEX 100 //最大顶点数#define INFINITY 0x7fffffff//最大值0x7fffffff表示为无穷大,表示不可通
typedef struct
{
int vexs; //顶点向量,顶点表
int arc; //邻接矩阵
int numVertexes, numEdges; //图中当前的顶点数和边数
}MGraph;
//建立无向网图的邻接矩阵
void CreateMGraph(MGraph *G)
{
int i, j, k, w;
printf("请输入顶点数和边数:\n");
scanf_s("%d %d", &G->numVertexes, &G->numEdges);
printf("请输入顶点名称:\n");
for (i = 0; i < G->numVertexes; i++)
{
scanf_s("%d ", &G->vexs);
}
for (i = 0; i < G->numVertexes; i++)
{
for (j = 0; j < G->numVertexes; j++)
{
G->arc = INFINITY; //邻接矩阵初始化
}
}
for (k = 0; k < G->numEdges; k++)
{
printf("请输入边(vi,vj)上的下标i,下标j和对应的权w:\n");
scanf_s("%d %d %d", &i, &j, &w);
G->arc = w;
G->arc = G->arc;
}
}//CreateMGraph
// Prim算法生成最小生成树
void MiniSpanTree_Prim(MGraph G)
{
int min, i, j, k,sum = 0;
int adjvex; // 保存相关顶点下标
int lowcost; // 保存相关顶点间边的权值
lowcost = 0; // V0作为最小生成树的根开始遍历,权值为0
adjvex = 0; // V0第一个加入
// 初始化操作
for (i = 1; i < G.numVertexes; i++)
{
lowcost = G.arc; // 将邻接矩阵第0行所有权值先加入数组
adjvex = 0; // 初始化全部先为V0的下标
}
// 真正构造最小生成树的过程
for (i = 1; i < G.numVertexes; i++)
{
min = INFINITY; // 初始化最小权值为0x7fffffff等不可能数值
k = 0;
// 遍历全部顶点
for (j = 1;j < G.numVertexes;j++)
{
// 找出lowcost数组已存储的最小权值
if (lowcost != 0 && lowcost < min)
{
min = lowcost; //找出权值最小的路径长度
k = j; // 将发现的最小权值的下标存入k,以待使用。
}
}
// 打印当前顶点边中权值最小的边及其权值
printf("V%d - V%d = %d\n", adjvex, k,min);
sum += min; //求和
lowcost = 0; // 将当前顶点的权值设置为0,表示此顶点已经完成任务,进行下一个顶点的遍历
// 邻接矩阵k行逐个遍历全部顶点
for (j = 1; j < G.numVertexes; j++)
{
if (lowcost != 0 && G.arc < lowcost) //对这一点直达的顶点进行路径更新
{
lowcost = G.arc;
adjvex = k;
}
}
}
printf("最小权值之和 = %d\n",sum);
}//MiniSpanTree_Prim
int main()
{
MGraph T;
CreateMGraph(&T);
MiniSpanTree_Prim(T);
return 0;
} file:///C:/Users/ASUS/Desktop/%E6%8D%95%E8%8E%B7.PNG
页:
[1]