算法快学笔记(十四):图的最小生成树算法

本文介绍了最小生成树的概念及其在电信网络连接中的应用。详细探讨了普利姆(Prim)算法和克鲁斯卡尔(Kruskal)算法,包括它们的原理、Python代码实现及实例分析。总结了两种算法的特点和适用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 介绍

最小生成树的应用场景很广,例如电信公司需要将9个村庄进行网络连接,村庄间的距离都不相同,怎么连接才能达到成本最小了?村庄结构图如下:
在这里插入图片描述

V0-V10分别表示村庄,节点间的权重代表距离,连接所有节点的总距离最小,就可以让成本更低。

定义:把构造连通整个图的最小代价生成树称为最小生成树。

2. 相关算法

普利姆与克鲁斯卡尔算法都是贪心算法

2.1 普利姆(Prim)算法

2.1.1 原理

普里姆算法(Prim算法):该算法于1930年由捷克数学家沃伊捷赫·亚尔尼克(英语:Vojtěch Jarník)发现;并在1957年由美国计算机科学家罗伯特·普里姆(英语:Robert C. Prim)独立发现;1959年,艾兹格·迪科斯彻再次发现了该算法。因此,在某些场合,普里姆算法又被称为DJP算法、亚尔尼克算法或普里姆-亚尔尼克算法。

算法的基本步骤如下:

  1. 输入:一个加权连通图,其中顶点集合为V,边集合为E;

  2. 初始化:Vnew = {x},其中x为集合V中的任一节点(起始点),Enew = {},为空;

  3. 重复下列操作,直到Vnew = V:

  • 在集合E中选取权值最小的边<u, v>,其中u为集合Vnew中的元素,而v不在Vnew集合当中,并且v∈V(如果存在有多条满足前述条件即具有相同权值的边,则可任意选取其中之一);
  • 将v加入集合Vnew中,将<u, v>边加入集合Enew中;
  1. 输出:使用集合Vnew和Enew来描述所得到的最小生成树。

算法实例推理步骤如下:
在这里插入图片描述

2.1.2 代码实现

基于邻接矩阵存储结构用Python实现的代码如下:

# -*- coding:utf-8 -*-
# @Author:sunaihua
"""
普里姆算法(Prim算法):最小生成树算法
本实现基于邻接矩阵存储结构
"""
MAX_VALUE = 65536

# 图结构的矩阵存储
graph = [
    [0, 10, MAX_VALUE, MAX_VALUE, MAX_VALUE, 11, MAX_VALUE, MAX_VALUE, MAX_VALUE],
    [10, 0, 18, MAX_VALUE, MAX_VALUE, MAX_VALUE, 16, MAX_VALUE, 12],
    [MAX_VALUE, MAX_VALUE, 0, 22, MAX_VALUE, MAX_VALUE, MAX_VALUE, MAX_VALUE, 8],
    [MAX_VALUE, MAX_VALUE, 22, 0, 20, MAX_VALUE, MAX_VALUE, 16, 21],
    [MAX_VALUE, MAX_VALUE, MAX_VALUE, 20, 0, 26, MAX_VALUE, 7, MAX_VALUE],
    [11, MAX_VALUE, MAX_VALUE, MAX_VALUE, 26, 0, 17, MAX_VALUE, MAX_VALUE],
    [MAX_VALUE, 16, MAX_VALUE, MAX_VALUE, MAX_VALUE, 17, 0, 19, MAX_VALUE],
    [MAX_VALUE, MAX_VALUE, MAX_VALUE, 16, 7
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值