C++ 算法学习——1.3 Prim算法

这是一个非常容易理解,非常简单的算法。

Prim算法是一种用于求解最小生成树的经典算法之一,它通过逐步选择与当前生成树相邻的具有最小权值的边来构建最小生成树。

Prim算法步骤:

  1. 初始化:选择任意一个顶点作为起始点,将其加入最小生成树中,并将其相邻的边加入候选边集合。

  2. 重复以下步骤直到所有顶点都被加入最小生成树

    • 从候选边集合中选择权值最小的边,将其加入最小生成树,并将其连接的顶点加入最小生成树的顶点集合。
    • 更新候选边集合,将新加入的顶点的所有相邻边中未在最小生成树中的边加入候选边集合。

    Prim(G, start):
    初始化空集合MST,空集合visited
    将start加入visited
    初始化优先队列PQ,加入与start相连的边

    复制代码
     当visited中的顶点数量不等于G中的所有顶点数量时:
         从PQ中取出权值最小的边edge
         如果edge.to不在visited中:
             将edge加入MST
             将edge.to加入visited
             对于edge.to相连的每条边:
                 如果边的另一端点不在visited中:
                     将边加入PQ
    
     返回MST
cpp 复制代码
#include <iostream>
#include <vector>
#include <queue>
#include <utility>

using namespace std;

#define INF 0x3f3f3f3f

typedef pair<int, int> pii;

void primMST(vector<vector<pii>>& graph, int start) {
    int V = graph.size();
    vector<int> key(V, INF);//快速赋值方法
    vector<bool> inMST(V, false);
    vector<int> parent(V, -1);
    priority_queue<pii, vector<pii>, greater<pii>> pq;

    pq.push(make_pair(0, start));
    key[start] = 0;

    while (!pq.empty()) {
        int u = pq.top().second;
        pq.pop();

        inMST[u] = true;

        for (auto& neighbor : graph[u]) {
            int v = neighbor.first;
            int weight = neighbor.second;

            if (!inMST[v] && weight < key[v]) {
                key[v] = weight;
                pq.push(make_pair(key[v], v));
                parent[v] = u;
            }
        }
    }

    // Print the MST
    cout << "Edge \tWeight\n";
    for (int i = 1; i < V; i++) {
        cout << parent[i] << " - " << i << "\t" << graph[i][parent[i]].second << "\n";
    }
}
相关推荐
YuTaoShao6 分钟前
【LeetCode 热题 100】73. 矩阵置零——(解法二)空间复杂度 O(1)
java·算法·leetcode·矩阵
Heartoxx7 分钟前
c语言-指针(数组)练习2
c语言·数据结构·算法
小张是铁粉12 分钟前
oracle的内存架构学习
数据库·学习·oracle·架构
大熊背21 分钟前
图像处理专业书籍以及网络资源总结
人工智能·算法·microsoft
HERR_QQ23 分钟前
【unify】unify的微信小程序开发学习 (to be continued)
学习·微信小程序·小程序
满分观察网友z25 分钟前
别怕树!一层一层剥开它的心:用BFS/DFS优雅计算层平均值(637. 二叉树的层平均值)
算法
江理不变情28 分钟前
图像质量对比感悟
c++·人工智能
apocelipes1 小时前
记一次ADL导致的C++代码编译错误
c++·开发工具和环境
杰克尼1 小时前
1. 两数之和 (leetcode)
数据结构·算法·leetcode
YuTaoShao2 小时前
【LeetCode 热题 100】56. 合并区间——排序+遍历
java·算法·leetcode·职场和发展