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";
    }
}
相关推荐
zhangrelay几秒前
影响移动固态磁盘稳定性的原因有哪些呢?
笔记·学习
安特尼4 分钟前
X 推荐算法分析
算法·机器学习·推荐算法
棒棒的皮皮1 小时前
【深度学习】YOLO学习教程汇总
深度学习·学习·yolo·计算机视觉
詩不诉卿1 小时前
Zephyr学习之spi flash驱动记录(w25q128)
学习
罗湖老棍子1 小时前
强迫症冒险家的任务清单:字典序最小拓扑排序
数据结构·算法·图论·拓扑排序
yanyu-yaya2 小时前
速学兼复习之vue3章节3
前端·javascript·vue.js·学习·前端框架
charlie1145141912 小时前
计算机图形学速通指南笔记(0)
c++·笔记·软件工程·计算机图形学·工程实践
不穿格子的程序员2 小时前
从零开始写算法——回溯篇4:分割回文串 + N皇后
算法·深度优先·dfs
带土12 小时前
2. C++ private、protected、public
开发语言·c++
ScilogyHunter2 小时前
qBI有什么用
算法·qbi