1. 介绍
最小生成树的应用场景很广,例如电信公司需要将9个村庄进行网络连接,村庄间的距离都不相同,怎么连接才能达到成本最小了?村庄结构图如下:
V0-V10分别表示村庄,节点间的权重代表距离,连接所有节点的总距离最小,就可以让成本更低。
定义:把构造连通整个图的最小代价生成树称为最小生成树。
2. 相关算法
普利姆与克鲁斯卡尔算法都是贪心算法
2.1 普利姆(Prim)算法
2.1.1 原理
普里姆算法(Prim算法):该算法于1930年由捷克数学家沃伊捷赫·亚尔尼克(英语:Vojtěch Jarník)发现;并在1957年由美国计算机科学家罗伯特·普里姆(英语:Robert C. Prim)独立发现;1959年,艾兹格·迪科斯彻再次发现了该算法。因此,在某些场合,普里姆算法又被称为DJP算法、亚尔尼克算法或普里姆-亚尔尼克算法。
算法的基本步骤如下:
-
输入:一个加权连通图,其中顶点集合为V,边集合为E;
-
初始化:Vnew = {x},其中x为集合V中的任一节点(起始点),Enew = {},为空;
-
重复下列操作,直到Vnew = V:
- 在集合E中选取权值最小的边<u, v>,其中u为集合Vnew中的元素,而v不在Vnew集合当中,并且v∈V(如果存在有多条满足前述条件即具有相同权值的边,则可任意选取其中之一);
- 将v加入集合Vnew中,将<u, v>边加入集合Enew中;
- 输出:使用集合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