4wall 发表于 2020-5-22 19:53:21

仿照数据结构的读书笔记写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;
}

4wall 发表于 2020-5-22 19:58:09

file:///C:/Users/ASUS/Desktop/%E6%8D%95%E8%8E%B7.PNG
页: [1]
查看完整版本: 仿照数据结构的读书笔记写prim算法的代码,结果运行时却错误,还看不出拿错了,求解!