Prim算法(Prim‘s Algorithm)

Prim算法(Prim's Algorithm),由罗伯特·普里姆(Robert C. Prim)于1957年提出,是一种用于构造加权无向图的最小生成树(Minimum Spanning Tree, MST)的贪心算法。最小生成树是一个无环子图,它包含图中的所有顶点,并且所有边的权重之和最小。Prim算法的基本思想是逐步从一个顶点开始,每次选择一条与当前生成树相连且权重最小的边,将其加入到生成树中,直到生成树包含图中的所有顶点。

主要特点

  1. 贪心策略:算法每次选择与当前生成树相连的、权重最小的边,确保每一步都是局部最优选择,最终得到全局最优解(即最小生成树)。

  2. 优先队列优化:为了高效地找到与当前生成树相连的最小权重边,通常使用优先队列(如二叉堆)存储候选边,这样每次都能直接获取当前最小权重边。

  3. 边的标记:在算法过程中,需要标记已加入到生成树中的边和尚未考虑的边,以便跟踪构建过程。

基本步骤

  1. 初始化

    • 选择一个起始顶点,将其加入到最小生成树中。
    • 将所有与起始顶点相邻的边加入优先队列,它们的权重即为当前最小权重。
    • 标记所有其他顶点为未访问。
  2. 循环处理

    • 从优先队列中取出权重最小的边(确保这条边至少一端属于当前生成树)。
    • 将这条边的未访问端点加入到最小生成树中。
    • 将所有与新加入顶点相邻且未被标记为已加入生成树的边,按照其权重加入优先队列。
    • 标记新加入顶点为已访问。
  3. 结束条件:当优先队列为空或所有顶点都被访问过(即已加入生成树)时,算法结束。

应用实例

Prim算法在实际中有多种应用,包括但不限于:

  • 网络设计:构建成本最低的通信网络,确保所有站点都能联通。
  • 旅行规划:在多个城市间规划一条总费用最低的旅行路线,要求经过所有城市。
  • 数据聚类:在相似性矩阵(视为加权无向图)中寻找一组核心顶点,使得所有顶点都与至少一个核心顶点相连,且所有边的总权重最小。

以下是Prim算法的Python实现示例(以邻接矩阵表示加权无向图,并使用内置的heapq模块实现优先队列):

 

Python

1import heapq
2
3def prim(graph, start):
4    n = len(graph)
5    mst = []
6    visited = [False] * n
7    distances = {node: float('inf') for node in range(n)}
8    distances[start] = 0
9
10    priority_queue = [(0, start)]  # (distance, node)
11
12    while priority_queue:
13        current_distance, current_node = heapq.heappop(priority_queue)
14
15        if visited[current_node]:
16            continue
17
18        visited[current_node] = True
19        mst.append(current_node)
20
21        for neighbor, weight in enumerate(graph[current_node]):
22            if not visited[neighbor] and weight < distances[neighbor]:
23                distances[neighbor] = weight
24                heapq.heappush(priority_queue, (weight, neighbor))
25
26    return mst
27
28# 示例
29graph = [
30    [0, 2, 0, 6, 0],
31    [2, 0, 3, 8, 5],
32    [0, 3, 0, 0, 7],
33    [6, 8, 0, 0, 9],
34    [0, 5, 7, 9, 0]
35]
36
37mst = prim(graph, 0)
38print("Minimum spanning tree nodes:", mst)

实现了Prim算法的核心逻辑,使用列表visited记录已访问顶点,优先队列priority_queue按权重排序待加入边,列表mst存储最小生成树的顶点。遍历结束后,返回一个列表,其中包含了最小生成树的顶点顺序。注意,这里仅输出了最小生成树包含的顶点,若需要输出具体的边信息,可以在算法中额外记录边的添加情况。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/10600.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

临近空间相关概念

临近空间概念 距地 20KM-100KM 的临近空间位于内外层空间之中&#xff0c;也称为 超高空、近空间、亚轨道等。 特点就是&#xff1a;纵跨 非电离层和电离层、空气稀薄&#xff0c;存在 臭氧、紫外、辐射等特殊环境 存在 重力波、行星波、大气放电等特殊现象。 临近空间高速飞…

##15 探索高级数据增强技术以提高模型泛化能力

文章目录 前言数据增强的重要性常见的数据增强技术高级数据增强技术在PyTorch中实现数据增强结论 前言 在深度学习领域&#xff0c;数据增强是一种有效的技术&#xff0c;它可以通过在原始数据上应用一系列变换来生成新的训练样本&#xff0c;从而增加数据的多样性&#xff0c…

前端 | 易混词卡片切换

文章目录 &#x1f4da;实现效果&#x1f4da;模块实现解析&#x1f407;html&#x1f407;css&#x1f407;javascript &#x1f4da;实现效果 绘制单词卡片效果&#xff0c;实现点击左半部分上翻&#xff0c;点击右半部分下翻。 &#x1f4da;模块实现解析 &#x1f407;…

品鉴中的个人风格:如何形成自己与众不同的红酒品鉴体验

品鉴云仓酒庄雷盛红酒不仅是一种感官体验&#xff0c;更是一种个人风格的展现。每个人都有自己与众不同的品味和偏好&#xff0c;通过品鉴红酒&#xff0c;我们可以形成自己与众不同的红酒品鉴体验。 要形成自己与众不同的红酒品鉴体验&#xff0c;首先需要勇于尝试不同类型的红…

conda 常用20个命令

conda常用20个命令 这些命令涵盖了Conda环境管理和包管理的常用功能&#xff0c;可帮助你有效地管理Python环境和软件包。 创建环境&#xff1a; conda create --name myenv这个命令用于创建一个名为myenv的新环境。你可以在--name后面指定环境的名称&#xff0c;并在其后加上…

C++语法之在谈const与模版参数

最近一直在复习C的语法&#xff0c;感觉遇到了不少问题&#xff0c;或许是之前没想的这么深。废话不说&#xff0c;开始说正事。 一、再谈const 有些朋友可能有些疑问&#xff0c;不就是const吗&#xff1f;我知道&#xff0c;const可以给非const赋值&#xff0c;反过来不行&…

通过mvn archetype 创建一个spring boot start 工程

mvn archetype https://maven.apache.org/archetype/index.html 遇到的问题 对于想自定义一个spring-boot-start的同学,比如 Springboot自定义Starter启动器 整个过程很繁琐。 定义属性开关增加 spring boot test start插件定义自动装载 spring.factories or org.springfra…

Webpack模块联邦:微前端架构的新选择

Webpack模块联邦&#xff08;Module Federation&#xff09;是Webpack 5引入的一项革命性特性&#xff0c;它彻底改变了微前端架构的实现方式。模块联邦允许不同的Web应用程序&#xff08;或微前端应用&#xff09;在运行时动态共享代码&#xff0c;无需传统的打包或发布过程中…

javax.net.ssl.SSLException: Received fatal alert: protocol_version已经解决

起因&#xff1a; 在帮别人讲解项目时&#xff0c;将项目的tomcat配置完&#xff0c;点击运行后&#xff0c;报错&#xff0c;信息如标题。 解决办法&#xff1a; 在csdn百度问题&#xff0c;得到的方法主要有几个&#xff1a; 1.jdk要配置在1.8以上&#xff1b; 2.数据库地…

Stable Diffusion是什么?

目录 一、Stable Diffusion是什么&#xff1f; 二、Stable Diffusion的基本原理 三、Stable Diffusion有哪些运用领域&#xff1f; 一、Stable Diffusion是什么&#xff1f; Stable Diffusion是一个先进的人工智能图像生成模型&#xff0c;它能够根据文本描述创造出高质量的图…

Spring IOC容器加载流程原理源码深度剖析

Spring IOC容器加载流程原理源码深度剖析 介绍 在Java开发中&#xff0c;Spring框架是非常常用的一个框架&#xff0c;它提供了很多便捷的功能和特性&#xff0c;其中最重要的就是IOC&#xff08;Inversion of Control&#xff09;容器。Spring IOC容器是Spring框架的核心&am…

邻接矩阵基础入门

引言 邻接矩阵是图论中表示图的一种方式&#xff0c;它通过矩阵来描述图中各顶点之间的连接关系。在邻接矩阵中&#xff0c;图中的每个顶点都对应矩阵中的一行和一列&#xff0c;矩阵中的元素表示顶点之间是否存在边以及边的权重&#xff08;如果是加权图&#xff09;。 定义和…

什么是ip地址?和dns地址的区别是什么?

大家都知道电脑想要上网需要配置ip地址和dns地址&#xff0c;手动配置、自动获取均可&#xff0c;但是ip地址是什么&#xff1f;和dns又有什么区别呢&#xff1f;小编给大家详细解释一下。 IP地址 IP,就是Internet Protocol的缩写&#xff0c;是一种通信协议&#xff0c;我们用…

信息检索(36):ConTextual Masked Auto-Encoder for Dense Passage Retrieval

ConTextual Masked Auto-Encoder for Dense Passage Retrieval 标题摘要1 引言2 相关工作3 方法3.1 初步&#xff1a;屏蔽自动编码3.2 CoT-MAE&#xff1a;上下文屏蔽自动编码器3.3 密集通道检索的微调 4 实验4.1 预训练4.2 微调4.3 主要结果 5 分析5.1 与蒸馏检索器的比较5.2 …

Flink面试整理-了解如何对Flink进行扩展和定制化开发,以满足特定的业务需求

Apache Flink 是一个灵活且可扩展的流处理框架,允许进行定制化开发以满足特定的业务需求。以下是对 Flink 进行扩展和定制化开发的几个主要方向: 1. 自定义算子(Operators) Flink 允许开发者编写自定义算子来实现特定的数据处理逻辑。例如,可以通过扩展 RichMapFunction 或…

AI学习指南概率论篇-条件概率和独立性

AI学习指南概率论篇-条件概率和独立性 概述 在人工智能领域&#xff0c;概率论是一项至关重要的工具。概率论不仅仅是用于量化不确定性&#xff0c;还在AI系统中扮演着关键角色。其中&#xff0c;条件概率和独立性是概率论中重要的概念之一&#xff0c;它们在AI领域有着广泛的…

适配qnx和linux平台的线程管理类封装

概述 封装代码仓库&#xff1a; https://gitee.com/liudegui/my_thread 尝试封装一个基于C11的多线程控制与调度类&#xff0c;适配QNX和Linux平台&#xff0c;它提供了以下主要功能&#xff1a; 线程的创建与销毁管理。线程的优先级调度。线程的CPU亲和性设置。线程的等待与…

[大师C语言(第四篇)]C语言段错误原理研究

C语言段错误原理研究&#xff08;一&#xff09; 段错误&#xff08;Segmentation Fault&#xff09;是C语言程序中常见的错误类型&#xff0c;它通常发生在程序尝试访问非法内存区域时。本文将深入探讨C语言段错误的原理&#xff0c;并分析其背后的技术原理。 段错误的定义 …

matlab人脸识别

在MATLAB中实现人脸识别通常涉及到图像处理、特征提取和分类器的使用。下面是一个简化的MATLAB人脸识别代码的概述&#xff0c;使用了PCA&#xff08;主成分分析&#xff09;作为特征提取方法&#xff0c;以及简单的分类器&#xff08;如最近邻分类器&#xff09;进行分类。请注…

无障碍Web开发:遵循WCAG标准构建包容性用户体验

无障碍Web开发旨在确保所有用户&#xff0c;无论其身体条件或能力如何&#xff0c;都能轻松、有效地访问和使用Web内容。遵循Web Content Accessibility Guidelines (WCAG) 标准是实现这一目标的关键。以下是一些基于WCAG标准的无障碍Web开发实践&#xff0c;以构建更具包容性的…