当前位置: 首页 > article >正文

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
#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";
    }
}


http://www.kler.cn/news/366041.html

相关文章:

  • 手写路由Vue-Router源码实现原理
  • 01 springboot-整合日志(logback-config.xml)
  • 【Linux系统编程】冯诺依曼体系结构与操作系统
  • LeetCode: 3274. 检查棋盘方格颜色是否相同
  • Python基础知识-模块与包篇
  • 【Prometheus】为Prometheus设置basic_auth访问权限
  • python操作CSV和excel,如何来做?
  • <项目代码>YOLOv8煤矿输送带异物识别<目标检测>
  • 安装Vue CLI的详细指南
  • 数据采集与数据分析:数据时代的双轮驱动
  • 零基础Java第十期:类和对象(一)
  • Mybatis mapper文件 resultType和resultMap的区别
  • 电脑重做系统后打游戏很卡
  • 循序渐进丨MogDB 与 PostgreSQL 对比测试IPv6
  • Flask-SocketIO 简单示例
  • unity游戏开发之塔防游戏
  • LinkAndroid v0.0.12 发布,手机连接助手,日志查看、投屏设置、多处问题修复
  • 光控资本:养老金融建设提速 高速铜缆市场空间广阔
  • 【工作技术栈】通用的旁路缓存一致性缺陷以及解决方式
  • ERR_PNPM_LINKING_FAILED Error: EPERM: operation not permitted, rename...
  • Scaffold-GS: Structured 3D Gaussians for View-Adaptive Rendering
  • 【python】OpenCV—findContours(4.2)
  • 【Go语言】
  • 简述特征降维的几种方式
  • IDEA中一个窗口打开多个项目-区别于eclipse
  • Netty-TCP服务端粘包、拆包问题(两种格式)