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";
    }
}
相关推荐
刚学HTML几秒前
leetcode 05 回文字符串
算法·leetcode
蜀黍@猿4 分钟前
【C++ 基础】从C到C++有哪些变化
c++
Am心若依旧4095 分钟前
[c++11(二)]Lambda表达式和Function包装器及bind函数
开发语言·c++
zh路西法15 分钟前
【C++决策和状态管理】从状态模式,有限状态机,行为树到决策树(一):从电梯出发的状态模式State Pattern
c++·决策树·状态模式
AC使者19 分钟前
#B1630. 数字走向4
算法
冠位观测者24 分钟前
【Leetcode 每日一题】2545. 根据第 K 场考试的分数排序
数据结构·算法·leetcode
轩辰~29 分钟前
网络协议入门
linux·服务器·开发语言·网络·arm开发·c++·网络协议
lxyzcm1 小时前
C++23新特性解析:[[assume]]属性
java·c++·spring boot·c++23
蜀黍@猿1 小时前
C/C++基础错题归纳
c++
虾球xz1 小时前
游戏引擎学习第55天
学习·游戏引擎