Python使用kruskal算法实现最小生成树

假如有多台计算机组成的局域网,不同计算机之间是使用光纤来连接的,如果把计算机看成是一个简单的节点,连接计算机的光纤看成是一条边,那这个局域网就可以抽象成为一个无向图:

Python使用kruskal算法实现最小生成树_第1张图片

添加图片注释,不超过 140 字(可选)

而对于这个图中的每个圆圈代表的是一个计算机,直线代表的是计算机之间的光纤连接,直线上的数字表示维护该条光纤所需要付出的成本,那现在需要降低维护成本,希望在不同计算机能够相互通信的基础上,去掉不必要的光纤连接,使得最终维护成本最少,而当把边去掉之后:

Python使用kruskal算法实现最小生成树_第2张图片

添加图片注释,不超过 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

你可能感兴趣的:(网络,python,算法)