zoukankan      html  css  js  c++  java
  • 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
    */

  • 相关阅读:
    laravel 安装完成后安装 vendor 目录
    requires php ~7.1 -> your PHP version (7.0.18) does not satisfy that requirement
    查看laravel版本
    git update-index --assume-unchanged
    Git 取消跟踪已版本控制的文件(亲测可行)
    git把某个文件去除版本控制
    git如何移除某文件夹的版本控制
    git如何移除某文件的版本控制
    git 教程
    Git branch && Git checkout常见用法
  • 原文地址:https://www.cnblogs.com/jjtx/p/2552358.html
Copyright © 2011-2022 走看看