基本概述
- 先看一个应用场景:
- 克鲁斯卡尔算法介绍:
克鲁斯卡尔算法图解
- 还是以上面的公交站图来解释:
- 最小连通子图(最小生成树):
- 以上图(G4)来说明,假设用数组 R 来保存最小生成树的结果:
- 详细描述:
克鲁斯卡尔算法分析
- 如何判断是否构成回路:
- 解释上面为什么各点的终点是F:
依次将边加入到最小生成树后,形成了一条相连的轨迹(如上图),C 能到到的最后位置就是F,同理D、E也是;对于目前F来说,它的终点就是自身F;所以这几条边都有终点了!
Python代码实现
补充知识点:如何获取int(long)和 float 的最值
- 获取 int 型的最大值
import sys
print(sys.maxsize) # 9223372036854775807
# 说明:这个应该为长整形long的最大值,我们对照下Java获取最大的结果来看
'''
Java中获取基本数据类型的最值的方法: 调用基本数据类型的包装类的MIN_VALUE与MAX_VALUE属性即可
具体如下:
- Integer.MIN_VALUE ⇒ -2147483648
- Integer.MAX_VALUE ⇒ 2147483647
- Long.MIN_VALUE ⇒ -9223372036854775808
- Long.MAX_VALUE ⇒ 9223372036854775807
- Float.MIN_VALUE ⇒ 1.4E-45
- Float.MAX_VALUE ⇒ 3.4028235E38
- Double.MIN_VALUE ⇒ 4.9E-324
- Double.MAX_VALUE ⇒ 1.7976931348623157E308
'''
# 注意 Python3 没有Python2 中的sys.maxint方法
- 获得 float 型的最大值
(1)Python中可以用如下方式表示正、负无穷:
float("inf") # 注意着不是字符串,最大的浮点数就是这个'inf'
print(type(float('inf'))) # <class 'float'>
float("-inf")
(2)利用 inf 做简单加、乘算术运算仍会得到 inf
>>> 1 + float('inf')
inf
>>> 2 * float('inf')
inf
(3)inf 乘以0会得到 not-a-number(NaN);除了inf外的其他数除以inf,会得到0
>>> 0 * float("inf")
nan
>>> 233 / float('inf')
0.0
>>> float('inf') / float('inf')
nan
- 运用到本次例子:为了更加好看,我们选取float类型的最值来表示
import sys
class GMap(object):
def __init__(self, vertex_data: [], matrix: []): # 传入顶点数组
self.edge_num = 0 # 边的个数
# self.vertex_data = vertex * [0] # 顶点数组
self.vertex_data = vertex_data
# self.matrix = [[0 for row in range(len(vertex_data))] for col in range(len(vertex_data))] # 邻接矩阵
self.matrix = matrix
# 使用 INF 表示两个顶点不能连通
self.inf = float('inf') # 获取浮点型最大值
# self.inf = sys.maxsize # 获取整形最大值
# 统计边
for i in range(len(vertex_data)):
for j in range(len(vertex_data)):
if self.matrix[i][j] != self.inf:
self.edge_num += 1
def print_test(self): # 打印测试
for i in range(len(self.vertex_data)):
for j in range(len(self.vertex_data)):
print(self.matrix[i][j], end=