Kama53.寻宝

如果你的图相对较小且比较密集,而且你更注重简单性和空间效率,数组实现可能更合适。

如果你的图规模较大,尤其是在稀疏图中,而且你更注重时间效率和通用性,优先级队列实现可能更合适。

其关键 在于弄清楚 minDist 的定义

#include <iostream>
#include <vector>
#include <queue>
#include <climits>

using namespace std;

// 定义图的邻接矩阵表示
const int INF = INT_MAX; // 表示无穷大
typedef vector<vector<int>> Graph;

// 使用Prim算法找到最小生成树
void primMST(const Graph& graph, int startVertex) {
    int V = graph.size();

    // 存储顶点是否在最小生成树中
    vector<bool> inMST(V, false);

    // 存储最小生成树的边权重
    vector<int> key(V, INF);

    // 优先队列,存储边权重和目标顶点
    priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq;

    // 初始顶点的权重设为0,加入优先队列
    key[startVertex] = 0;
    pq.push({0, startVertex});

    while (!pq.empty()) {
        // 从优先队列中取出权重最小的边
        int u = pq.top().second;
        pq.pop();

        // 将顶点u标记为在最小生成树中
        inMST[u] = true;

        // 遍历u的所有邻居
        for (int v = 0; v < V; ++v) {
            // 如果v未在最小生成树中,且u到v的权重小于v的当前权重
            if (!inMST[v] && graph[u][v] < key[v]) {
                // 更新v的权重为u到v的权重
                key[v] = graph[u][v];
                // 将(u, v)添加到最小生成树
                pq.push({key[v], v});
            }
        }
    }

    // 输出最小生成树的边
    cout << "Edges in the Minimum Spanning Tree:\n";
    for (int i = 1; i < V; ++i) {
        cout << i << " - " << key[i] << " - " << i << "\n";
    }
}

int main() {
    // 例子:无向图的邻接矩阵表示
    Graph graph = {
        {0, 2, 0, 6, 0},
        {2, 0, 3, 8, 5},
        {0, 3, 0, 0, 7},
        {6, 8, 0, 0, 9},
        {0, 5, 7, 9, 0}
    };

    // 从顶点0开始运行Prim算法
    primMST(graph, 0);

    return 0;
}
#include <iostream>
#include <vector>
#include <climits>

using namespace std;

// 定义图的邻接矩阵表示
const int INF = INT_MAX; // 表示无穷大
typedef vector<vector<int>> Graph;

// 使用Prim算法找到最小生成树
void primMST(const Graph& graph, int startVertex) {
    int V = graph.size();

    // 存储顶点是否在最小生成树中
    vector<bool> inMST(V, false);

    // 存储每个顶点的权重
    vector<int> key(V, INF);

    // 初始化起始顶点的权重为0
    key[startVertex] = 0;

    // 存储最小生成树的边权重
    vector<int> parent(V, -1);

    // 构建最小生成树
    for (int count = 0; count < V - 1; ++count) {
        // 从未在最小生成树中的顶点中找到权重最小的顶点
        int u = -1;
        for (int v = 0; v < V; ++v) {
            if (!inMST[v] && (u == -1 || key[v] < key[u])) {
                u = v;
            }
        }

        // 将顶点u标记为在最小生成树中
        inMST[u] = true;

        // 更新u的邻居的权重和父节点
        for (int v = 0; v < V; ++v) {
            if (graph[u][v] != 0 && !inMST[v] && graph[u][v] < key[v]) {
                key[v] = graph[u][v];
                parent[v] = u;
            }
        }
    }

    // 输出最小生成树的边
    cout << "Edges in the Minimum Spanning Tree:\n";
    for (int i = 1; i < V; ++i) {
        cout << parent[i] << " - " << key[i] << " - " << i << "\n";
    }
}

int main() {
    // 例子:无向图的邻接矩阵表示
    Graph graph = {
        {0, 2, 0, 6, 0},
        {2, 0, 3, 8, 5},
        {0, 3, 0, 0, 7},
        {6, 8, 0, 0, 9},
        {0, 5, 7, 9, 0}
    };

    // 从顶点0开始运行Prim算法
    primMST(graph, 0);

    return 0;
}