MST(Prim, 邻接矩阵)

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;

const int VERTEX_NUM = 7;
const int INF = 0x7fffffff;

struct V_UArc {
    int adjvex;
    int lowcost;            // V中的顶点的lowcost为0以作标记
}closedge[VERTEX_NUM + 1];  // 记录从顶点集U到V-U的代价最小的边的辅助数组定义

int Minimum(V_UArc closedge[VERTEX_NUM + 1])
{
    // 选出连接V-U到U的具有最小权值的边
    // 此时closedge[k].lowcost =
    // MIN{ closedge[vi].lowcost | closedge[vi].lowcost>0, vi∈V-U }

    int k = -1;    // 初始化,虽然可能没用
    for (int i = 1; i <= VERTEX_NUM; i++) {    // 选出满足closedge[vi].lowcost>0, vi∈V-U的第一个
        if (0 < closedge[i].lowcost && closedge[i].lowcost < INF) {
            k = i;
            break;
        }
    }
    for (int i = k + 1; i <= VERTEX_NUM; i++) {
        if (0 < closedge[i].lowcost && closedge[i].lowcost < INF) {
            if (closedge[i].lowcost < closedge[k].lowcost)    // 满足条件之后选小的
                k = i;
        }
    }
    return k;
}

void MiniSpanTree_PRIM(int G[VERTEX_NUM + 1][VERTEX_NUM + 1], int k) // k>=1
{
    // 用普里姆算法从第k个顶点出发构造网G的最小生成树T,输出T的各条边

    for (int j = 1; j <= VERTEX_NUM; ++j) {     // 辅助数组初始化
        if (j != k) {
            closedge[j].adjvex = k;
            closedge[j].lowcost = G[k][j];
        }
    }
    //    closedge[k].adjvex = k;                    // 此值不关心
    closedge[k].lowcost = 0;                    // 初始,U={k}
    for (int i = 0; i < VERTEX_NUM - 1; i++) {  // 选择其余VERTEX_NUM-1个顶点
        k = Minimum(closedge);                    // 求出T的下一个结点:第k顶点
        cout << closedge[k].adjvex << "---" << k << endl;
        closedge[k].lowcost = 0;                // 第k顶点并入U集

        for (int j = 1; j <= VERTEX_NUM; ++j) {
            // 新顶点并入U后重新对V-U中的顶点选择最小边(U中的顶点lowcost==0)
            if (G[k][j] < closedge[j].lowcost) {
                closedge[j].adjvex = k;
                closedge[j].lowcost = G[k][j];
            }
        }
    }
}

void CreatAdjMatrixGraph(int G[VERTEX_NUM + 1][VERTEX_NUM + 1])
{
    for (int i = 1; i <= VERTEX_NUM; i++) {
        for (int j = 1; j <= VERTEX_NUM; j++)
            G[i][j] = INF;
    }
    int a;
    int b;
    int w;
    while ( cin >> a >> b >> w,
        !(a == 0 && b == 0 && w == 0) ) {            //以0 0 0作为输入结束
            G[a][b] = w;
            G[b][a] = w;
    }
}

void Display(int G[VERTEX_NUM + 1][VERTEX_NUM + 1])
{
    for (int i = 1; i <= VERTEX_NUM; i++) {            // 输出邻接矩阵
        for (int j = 1; j <= VERTEX_NUM; j++) {
            if (G[i][j] == INF)
                cout << "";
            else
                cout << G[i][j] << "  ";            // 不是'  '
        }
        cout << endl;
    }
}

int main(int argc, char **argv)
{
    freopen("cin.txt", "r", stdin);
    int G[VERTEX_NUM + 1][VERTEX_NUM + 1];

    CreatAdjMatrixGraph(G);

    Display(G);

    int k = 3; // 从第k个顶点出发构造MST
    MiniSpanTree_PRIM(G, k);

    return 0;
}

/* cin.txt:
3 1 1
3 2 5
3 5 6
3 6 4
3 4 5
1 2 6
2 5 3
5 6 6
6 4 2
4 1 5
6 7 1
0 0 0
*/

原文地址:https://www.cnblogs.com/jjtx/p/2552358.html