假如有多台计算机组成的局域网,不同计算机之间是使用光纤来连接的,如果把计算机看成是一个简单的节点,连接计算机的光纤看成是一条边,那这个局域网就可以抽象成为一个无向图:
添加图片注释,不超过 140 字(可选)
而对于这个图中的每个圆圈代表的是一个计算机,直线代表的是计算机之间的光纤连接,直线上的数字表示维护该条光纤所需要付出的成本,那现在需要降低维护成本,希望在不同计算机能够相互通信的基础上,去掉不必要的光纤连接,使得最终维护成本最少,而当把边去掉之后:
添加图片注释,不超过 140 字(可选)
而如何删除不必要的边,使得最终剩下的边在连接所有节点的情况下,维护成本最小,我们可以假设在所有节点都不连接的情况下,如何将所有边加上,这里是可以采用kruskal算法,其基本思路是每次选择一条成本最低且不形成环的边,这里的环也就是指从一个节点出发能够返回原节点的路径。
python实现kruskal算法的代码如下:
class Vertex:
def __init__(self name):
self.parent = self #parent对应节点指针默认指向它自己
self.rank = 0 #rank表示子节点的个数
self.name = name #节点名字
def point_to(self v): #将指针指向另一个节点
if v is not None:
self.parent = v
def get_parent(self): #获取节点指针指向的节点
return self.parent
def find(self): #获取集合中的根节点
x = self
while x.get_parent() != x:
x = x.get_parent()
return x
def set_rank(self r):
self.rank = r
def get_rank(self):
return self.rank
def get_name(self):
return self.name