prim算法求最小生成树代码

时间: 2023-07-22 08:08:59 浏览: 26
以下是使用 Prim 算法求解最小生成树的代码(C++实现): ```cpp #include <iostream> #include <vector> #include <queue> using namespace std; const int INF = 0x3f3f3f3f; // 存储图的邻接表 vector<pair<int, int>> adj[100001]; // Prim 算法求最小生成树,返回最小生成树的总权值 int prim(int n, int start) { int res = 0; // 最小生成树的总权值 vector<bool> visited(n + 1, false); // 记录每个节点是否已经被加入集合 priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq; // 小根堆,存储从集合中出发的边 // 将起点加入集合 visited[start] = true; for (auto p : adj[start]) { pq.push({ p.second, p.first }); } while (!pq.empty()) { auto [w, u] = pq.top(); pq.pop(); if (visited[u]) continue; // 如果这个点已经在集合中,跳过 visited[u] = true; res += w; // 将这条边的权值加入最小生成树的总权值中 for (auto p : adj[u]) { if (!visited[p.first]) { pq.push({ p.second, p.first }); } } } return res; } int main() { int n, m; cin >> n >> m; // 输入节点个数和边数 for (int i = 0; i < m; i++) { int u, v, w; cin >> u >> v >> w; // 输入每条边的起点、终点和权值 adj[u].push_back({ v, w }); adj[v].push_back({ u, w }); } int start; cin >> start; // 输入起点 cout << prim(n, start) << endl; // 输出最小生成树的总权值 return 0; } ``` 其中,`adj` 数组存储了图的邻接表,`pq` 存储了从集合中出发的边,`visited` 数组记录每个节点是否已经被加入集合。在 `prim` 函数中,我们首先将起点加入集合,然后将起点可以到达的所有节点加入小根堆,依次取出堆顶元素,如果这个节点已经在集合中,则跳过;否则,将它加入集合,并将它可以到达的所有节点加入小根堆中。最后返回最小生成树的总权值即可。

相关推荐

Prim算法是一种常用于求解最小生成树的贪心算法。下面是使用Matlab实现Prim算法的代码: matlab function MST = prim_algorithm(adj_matrix) num_nodes = size(adj_matrix, 1); % 获取节点数 MST = zeros(num_nodes, num_nodes); % 创建最小生成树的邻接矩阵 visited = zeros(1, num_nodes); % 创建访问标记数组 visited(1) = 1; % 从第一个节点开始 while sum(visited) < num_nodes min_weight = Inf; % 初始化最小权重为无穷大 min_edge = [0, 0]; % 初始化最小权重边 % 遍历已访问节点,找到与未访问节点连接的最小权重边 for i = 1:num_nodes if visited(i) == 1 for j = 1:num_nodes if visited(j) == 0 && adj_matrix(i,j) < min_weight min_weight = adj_matrix(i,j); min_edge = [i, j]; end end end end % 将找到的最小权重边添加到最小生成树邻接矩阵,并标记已访问节点 MST(min_edge(1), min_edge(2)) = min_weight; MST(min_edge(2), min_edge(1)) = min_weight; visited(min_edge(2)) = 1; end end 上述代码中,adj_matrix是图的邻接矩阵,其中adj_matrix(i, j)表示节点i和节点j之间的边的权重。算法首先创建一个大小与邻接矩阵相同的邻接矩阵MST来存储最小生成树的边,然后创建一个大小为num_nodes的访问标记数组visited来标记已访问的节点。算法从第一个节点开始,每次遍历已访问的节点,找到与未访问节点连接的最小权重边,并将其添加到最小生成树邻接矩阵MST中。最终,返回得到的最小生成树邻接矩阵MST。
以下是使用C语言实现Prim算法求最小生成树的示例代码: c #include <stdio.h> #include <stdlib.h> #include #define 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 } }; int minKey(int key[], int mstSet[]) { int min = INT_MAX, min_index; for (int i = 0; i < V; i++) { if (mstSet[i] == 0 && key[i] < min) { min = key[i]; min_index = i; } } return min_index; } void printMST(int parent[]) { printf("Edge \tWeight\n"); for (int i = 1; i < V; i++) { printf("%d - %d \t%d\n", parent[i], i, graph[i][parent[i]]); } } void primMST() { int parent[V]; // 存储最小生成树中每个顶点的父亲节点 int key[V]; // 存储每个顶点到最小生成树的距离 int mstSet[V]; // 存储每个顶点是否已经加入最小生成树 for (int i = 0; i < V; i++) { key[i] = INT_MAX; // 初始化key数组为无穷大 mstSet[i] = 0; // 初始化mstSet数组为0 } key[0] = 0; // 将初始顶点的key值设为0,加入最小生成树 parent[0] = -1; // 根节点没有父亲节点 for (int i = 0; i < V - 1; i++) { int u = minKey(key, mstSet); // 找到未加入最小生成树的key值最小的顶点 mstSet[u] = 1; // 将该顶点加入最小生成树 for (int v = 0; v < V; v++) { if (graph[u][v] && mstSet[v] == 0 && graph[u][v] < key[v]) { parent[v] = u; // 更新v的父亲节点为u key[v] = graph[u][v]; // 更新v到最小生成树的距离为u到v的距离 } } } printMST(parent); // 输出最小生成树 } int main() { primMST(); // 求解最小生成树 return 0; } 该代码使用邻接矩阵表示图,其中V表示图的顶点数,graph数组表示图的邻接矩阵。primMST函数使用Prim算法求解最小生成树,其中parent数组存储最小生成树中每个顶点的父亲节点,key数组存储每个顶点到最小生成树的距离,mstSet数组存储每个顶点是否已经加入最小生成树。minKey函数用于找到未加入最小生成树的key值最小的顶点,printMST函数用于输出最小生成树。
zip
【资源介绍】 基于React.js和Ant Design实现的博客管理后台项目源码+项目说明.zip 一个基于 React.js 完整的管理后台,包含登录权限,文章管理,分类管理,用户管理,评论管理,回复管理模块 - 技术栈:React.js, Reack-Hooks, react-redux, react-router, react-query - UI 框架:Ant-Design 技术亮点: - 根据官方脚手架 CRA 版本从 0 - 1 搭建,结合 antd UI 框架,完成清晰的项目架构目录 - React Hook,自定义 Hooks 复用方法,提高项目开发效率 - 状态管理 Redux Toolkit,React Query 管理服务端状态 - 路由懒加载,减少打包体积 - 搭建极简版 markdown 编辑器,轻量快捷,让写 md 更加清爽 安装启动 # 安装包 npm install 或者 yarn install # 启动 npm start 或者 yarn start 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,也适用于小白学习入门进阶。当然也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或者热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载,沟通交流,互相学习,共同进步!

最新推荐

C++使用Kruskal和Prim算法实现最小生成树

主要介绍了C++使用Kruskal和Prim算法实现最小生成树,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

torchvision-0.8.2+cpu-cp38-cp38-linux_x86_64.whl

torchvision-0.8.2+cpu-cp38-cp38-linux_x86_64

CLXHHandleEngine

支持以下字符集: (1)字符集:多字节 代码生成=》运行库:多线程调试DLL(/MDd) CLXHHandleEngine_d.lib CLXHHandleEngine_d.dll (2)字符集:多字节 代码生成=》运行库:多线程DLL(/MD) XCLXHHandleEngine.lib CLXHHandleEngine.dll (3)字符集:Unicode 代码生成=》运行库:多线程调试DLL(/MDd) CLXHHandleEngine_ud.lib CLXHHandleEngine_ud.dll (4)字符集:Unicode 代码生成=》运行库:多线程DLL(/MD) CLXHHandleEngine_u.lib CLXHHandleEngine_u.dll

基于React.js和Ant Design实现的博客管理后台项目源码+项目说明.zip

【资源介绍】 基于React.js和Ant Design实现的博客管理后台项目源码+项目说明.zip 一个基于 React.js 完整的管理后台,包含登录权限,文章管理,分类管理,用户管理,评论管理,回复管理模块 - 技术栈:React.js, Reack-Hooks, react-redux, react-router, react-query - UI 框架:Ant-Design 技术亮点: - 根据官方脚手架 CRA 版本从 0 - 1 搭建,结合 antd UI 框架,完成清晰的项目架构目录 - React Hook,自定义 Hooks 复用方法,提高项目开发效率 - 状态管理 Redux Toolkit,React Query 管理服务端状态 - 路由懒加载,减少打包体积 - 搭建极简版 markdown 编辑器,轻量快捷,让写 md 更加清爽 安装启动 ``` # 安装包 npm install 或者 yarn install # 启动 npm start 或者 yarn start ``` 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,也适用于小白学习入门进阶。当然也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或者热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载,沟通交流,互相学习,共同进步!

存储系统设计(HUST)

存储系统设计(HUST)

哈希排序等相关算法知识

哈希排序等相关算法知识

混合神经编码调制的设计和训练方法

可在www.sciencedirect.com在线获取ScienceDirectICTExpress 8(2022)25www.elsevier.com/locate/icte混合神经编码调制:设计和训练方法Sung Hoon Lima,Jiyong Hana,Wonjong Noha,Yujae Songb,Sang-WoonJeonc,a大韩民国春川,翰林大学软件学院b韩国龟尾国立技术学院计算机软件工程系,邮编39177c大韩民国安山汉阳大学电子电气工程系接收日期:2021年9月30日;接收日期:2021年12月31日;接受日期:2022年1月30日2022年2月9日在线发布摘要提出了一种由内码和外码组成的混合编码调制方案。外码可以是任何标准的二进制具有有效软解码能力的线性码(例如,低密度奇偶校验(LDPC)码)。内部代码使用深度神经网络(DNN)设计,该深度神经网络获取信道编码比特并输出调制符号。为了训练DNN,我们建议使用损失函数,它是受广义互信息的启发。所得到的星座图被示出优于具有5G标准LDPC码的调制�

利用Pandas库进行数据分析与操作

# 1. 引言 ## 1.1 数据分析的重要性 数据分析在当今信息时代扮演着至关重要的角色。随着信息技术的快速发展和互联网的普及,数据量呈爆炸性增长,如何从海量的数据中提取有价值的信息并进行合理的分析,已成为企业和研究机构的一项重要任务。数据分析不仅可以帮助我们理解数据背后的趋势和规律,还可以为决策提供支持,推动业务发展。 ## 1.2 Pandas库简介 Pandas是Python编程语言中一个强大的数据分析工具库。它提供了高效的数据结构和数据分析功能,为数据处理和数据操作提供强大的支持。Pandas库是基于NumPy库开发的,可以与NumPy、Matplotlib等库结合使用,为数

帮我用C++和Qt写一个m*n的矩阵最小路径和可视化,要求用格子展示,最小路径采用其它的颜色标记

好的,以下是一个基本的实现: 1. 首先需要定义一个矩阵类来存储矩阵数据和计算最小路径和。 ```c++ class Matrix{ public: Matrix(int rows, int cols); ~Matrix(); void setValue(int i, int j, int value); //设置元素的值 int getValue(int i, int j); //获取元素的值 int getRows(); //获取行数 int getCols(); //获取列数 int getMinPathSum(); //获取最

基于android的视频播放器的设计与实现--大学毕业论文.doc

基于android的视频播放器的设计与实现--大学毕业论文.doc