0

0

C++怎么实现一个最小生成树Prim算法_C++图论算法与邻接矩阵实现

冰火之心

冰火之心

发布时间:2025-11-24 19:50:02

|

193人浏览过

|

来源于php中文网

原创

Prim算法从起始顶点出发,每次选择最近顶点加入生成树,利用贪心策略构建最小生成树。通过邻接矩阵存储图,用key数组记录各顶点到生成树的最短距离,mstSet标记已选顶点。初始化key为无穷大,起点key为0。循环中选取key最小且未访问的顶点u,将其加入MST,并遍历其邻接点v:若存在边(u,v)且v未访问且该边权重小于当前key[v],则更新parent[v]=u和key[v]=graphu。最终输出每条MST边及权重,总时间复杂度O(V²),适用于稠密图。示例图中MST总权值为16。

c++怎么实现一个最小生成树prim算法_c++图论算法与邻接矩阵实现

Prim算法用于在加权无向图中找出最小生成树(MST),即连接所有顶点且总权重最小的子树。C++中结合邻接矩阵实现该算法,逻辑清晰、便于理解。

Prim算法基本思想

从任意一个起始顶点开始,逐步将距离当前生成树最近的顶点加入集合,直到所有顶点都被包含。每次选择边权最小的边进行扩展,使用贪心策略保证整体最优。

关键点:

  • 维护一个集合表示已加入生成树的顶点
  • 用数组记录每个顶点到当前生成树的最短距离
  • 每次选出未访问顶点中距离最小者,并更新其邻接点的距离

邻接矩阵存储图结构

使用二维数组graph[V][V]表示图,graph[i][j]为顶点i到j的边权。若无边,则设为一个极大值(如INT_MAX)。

立即学习C++免费学习笔记(深入)”;

示例代码定义:

const int V = 5; // 顶点数
int graph[V][V] = {
    {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}
};

Prim算法实现步骤

以下是基于邻接矩阵的Prim算法完整实现:

Originality AI
Originality AI

专门为网络出版商设计的抄袭和AI检测工具

下载
#include 
#include 
using namespace std;

int minKey(int key[], bool mstSet[]) { int min = INT_MAX, min_index; for (int v = 0; v < V; v++) if (!mstSet[v] && key[v] < min) min = key[v], min_index = v; return min_index; }

void printMST(int parent[], int graph[V][V]) { cout << "Edge \tWeight\n"; for (int i = 1; i < V; i++) cout << parent[i] << " - " << i << "\t" << graph[i][parent[i]] << endl; }

void primMST(int graph[V][V]) { int parent[V]; int key[V]; bool mstSet[V];

for (int i = 0; i zuojiankuohaophpcn V; i++)
    key[i] = INT_MAX, mstSet[i] = false;

key[0] = 0;
parent[0] = -1;

for (int count = 0; count zuojiankuohaophpcn V - 1; count++) {
    int u = minKey(key, mstSet);
    mstSet[u] = true;

    for (int v = 0; v zuojiankuohaophpcn V; v++)
        if (graph[u][v] && !mstSet[v] && graph[u][v] zuojiankuohaophpcn key[v])
            parent[v] = u, key[v] = graph[u][v];
}

printMST(parent, graph);

}

运行与输出说明

调用primMST(graph)后,程序输出每条选中的边及其权重。例如:

Edge    Weight
0 - 1   2
1 - 2   3
0 - 3   6
1 - 4   5

总权重为 2+3+6+5=16,构成一棵最小生成树。

时间复杂度为 O(V²),适合稠密图。若用优先队列优化可降至 O(E log V),但邻接矩阵下不易实现稀疏结构。

基本上就这些。掌握这个版本有助于理解Prim核心机制,后续可拓展为邻接表或动态图处理。

相关专题

更多
页面置换算法
页面置换算法

页面置换算法是操作系统中用来决定在内存中哪些页面应该被换出以便为新的页面提供空间的算法。本专题为大家提供页面置换算法的相关文章,大家可以免费体验。

405

2023.08.14

c++ 根号
c++ 根号

本专题整合了c++根号相关教程,阅读专题下面的文章了解更多详细内容。

25

2026.01.23

c++空格相关教程合集
c++空格相关教程合集

本专题整合了c++空格相关教程,阅读专题下面的文章了解更多详细内容。

31

2026.01.23

yy漫画官方登录入口地址合集
yy漫画官方登录入口地址合集

本专题整合了yy漫画入口相关合集,阅读专题下面的文章了解更多详细内容。

119

2026.01.23

漫蛙最新入口地址汇总2026
漫蛙最新入口地址汇总2026

本专题整合了漫蛙最新入口地址大全,阅读专题下面的文章了解更多详细内容。

180

2026.01.23

C++ 高级模板编程与元编程
C++ 高级模板编程与元编程

本专题深入讲解 C++ 中的高级模板编程与元编程技术,涵盖模板特化、SFINAE、模板递归、类型萃取、编译时常量与计算、C++17 的折叠表达式与变长模板参数等。通过多个实际示例,帮助开发者掌握 如何利用 C++ 模板机制编写高效、可扩展的通用代码,并提升代码的灵活性与性能。

16

2026.01.23

php远程文件教程合集
php远程文件教程合集

本专题整合了php远程文件相关教程,阅读专题下面的文章了解更多详细内容。

70

2026.01.22

PHP后端开发相关内容汇总
PHP后端开发相关内容汇总

本专题整合了PHP后端开发相关内容,阅读专题下面的文章了解更多详细内容。

63

2026.01.22

php会话教程合集
php会话教程合集

本专题整合了php会话教程相关合集,阅读专题下面的文章了解更多详细内容。

64

2026.01.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 7.5万人学习

C 教程
C 教程

共75课时 | 4.2万人学习

C++教程
C++教程

共115课时 | 13.7万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号