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
    */

  • 相关阅读:
    Python学习札记(十五) 高级特性1 切片
    LeetCode Longest Substring Without Repeating Characters
    Python学习札记(十四) Function4 递归函数 & Hanoi Tower
    single number和变体
    tusen 刷题
    实验室网站
    leetcode 76. Minimum Window Substring
    leetcode 4. Median of Two Sorted Arrays
    leetcode 200. Number of Islands 、694 Number of Distinct Islands 、695. Max Area of Island 、130. Surrounded Regions 、434. Number of Islands II(lintcode) 并查集 、178. Graph Valid Tree(lintcode)
    刷题注意事项
  • 原文地址:https://www.cnblogs.com/jjtx/p/2552358.html
Copyright © 2011-2022 走看看