首页 > 编程语言 >python | 算法-最小生成树-prim算法

python | 算法-最小生成树-prim算法

时间:2022-10-24 13:12:31浏览次数:77  
标签:prim python graph edges record 算法 edge

写在前面:
我自己用python练习算法与数据结构的典型算法汇总在这里:汇总-算法与数据结构-python版,欢迎翻阅!

1️⃣ 参考链接https://github.com/algorithmzuo/algorithmbasic2020/blob/master/src/class16/Code05_Prim.java

2️⃣ 所用例子

数据结构

与前章同:python | 算法-图的宽度优先遍历

prim算法

# prim(最小生成树-prim算法)
# for undirected graph(要求:无向图)
# graph数据结构与这里一样:https://www.cnblogs.com/ljdsbfj/p/16800650.html
class Prim:
    def prim(self, graph):
        """
        prim算法,返回图graph的最小生成树(总权值最小的边的集合)
        :param graph: Graph
        :return: list
        """
        # record: 所有访问过的节点
        record = []
        # edges: record中所有节点所解锁的边
        edges = []
        # result: 依次挑选出的边
        result = []
        for node in graph.nodes.values(): # 随意挑选一个点node作为起始点
            # record更新访问过的点
            record.append(node)
            for edge in node.edges: # 由一个点解锁所有相连的边
                edges.append(edge)
            while len(edges) > 0: # 每次取出权重最小的边
                edge = min(edges, key=lambda edge: edge.weight)
                edges.remove(edge)
                to_node = edge.n_to # 解锁该边的另一个端点
                if to_node not in record:
                    record.append(to_node) # record更新访问过的点
                    result.append(edge) # result更新挑选上的边
                    # 根据该端点又解锁新的相连的边
                    for next_edge in to_node.edges:
                        edges.append(next_edge)

        return result

# test
# 自定义一个无向连通图
m = [[7, 'A', 'B'], [5, 'A', 'D'], [9, 'B', 'D'],
     [8, 'B', 'C'], [7, 'B', 'E'], [5, 'C', 'E'],
     [15, 'D', 'E'], [6, 'D', 'F'], [8, 'E', 'F'],
     [9, 'E', 'G'], [11, 'F', 'G'],
     [7, 'B', 'A'], [5, 'D', 'A'], [9, 'D', 'B'],
     [8, 'C', 'B'], [7, 'E', 'B'], [5, 'E', 'C'],
     [15, 'E', 'D'], [6, 'F', 'D'], [8, 'F', 'E'],
     [9, 'G', 'E'], [11, 'G', 'F']]
generator = GraphGenerator()
graph = generator.createGraph(m)

p = Prim()
res_edge_list = p.prim(graph)

# 打印prim算法结果
output = [] # 边信息输出
min_weights_sum = 0 # 权值的最小和
for _, edge in enumerate(res_edge_list):
    output.append(str(edge.n_from.value) + str(edge.n_to.value))
    min_weights_sum += edge.weight
print("Prim算法选出的边:\n", output)
print("最小和=", min_weights_sum)

# 输出
# Prim算法选出的边:
#  ['AD', 'DF', 'AB', 'BE', 'EC', 'EG']
# 最小和= 39

标签:prim,python,graph,edges,record,算法,edge
From: https://www.cnblogs.com/ljdsbfj/p/16821128.html

相关文章

  • 学习笔记:python学生系统
    python学习学生管理系统问题l={}s={}end=Trueprint("欢迎使用学生信息管理系统!\n""退出请按0\n""加入学生信息请按1\n""查询学生信息请按......
  • 学习笔记:python杨辉三角
    python学习问题输出杨辉三角刚开始着手这题,我先是使用杨辉三角的公式,采用比较简洁的写法进行。defjc(x):r=1forkinrange(1,x+1):r=r*k......
  • 学习笔记:python统计单词数
    python学习问题:统计文章中某个单词出现的次数英文由空格分割开每个单词,所以我采用以下方法:a=str(input("请输入一段英文:"))a=a.lower()b=a.split("")c=str......
  • 学习笔记:python语句try
    python学习使用try在进行读取用户输入时,如果我们想读取一个整型,而用户进行了错误的输入,那么程序便会出错,或者当我们做商时,除数为0;这时便可以采用该代码块,来避免程序报错......
  • 数据挖掘算法—K-Means算法
    一位读者建议多分享一些具体算法相关的内容,这期分享一下数据挖掘相关的算法。简介又叫K-均值算法,是非监督学习中的聚类算法。基本思想k-means算法比较简单。在k-means算法中......
  • 实验一:决策树算法实验
    【实验目的】理解决策树算法原理,掌握决策树算法框架;理解决策树学习算法的特征选择、树的生成和树的剪枝;能根据不同的数据类型,选择不同的决策树算法;针对特定应用场景及......
  • React面试:谈谈虚拟DOM,Diff算法与Key机制
    1.虚拟dom原生的JSDOM操作非常消耗性能,而React把真实原生JSDOM转换成了JavaScript对象。这就是虚拟Dom(VirtualDom)每次数据更新后,重新计算虚拟Dom,并和上一次生成的虚拟......
  • python中的“and”、“or”运算规则
    #1、所有变量的位操作都是通过强制转换成bool实现#2、在没有括号的情况下,and优先级高于or#3、计算逻辑:"""xandy表示:ifxisfalse,thenx,elseyxory表......
  • Python基础
    1.Python的数据类型1.Numbers数字类型包括int(整型);bool(布尔类型);float(浮点型);complex(复数) 2. String字符串类型1.用单引号或者......
  • 实验一:决策树算法实验
    一、【实验目的】理解决策树算法原理,掌握决策树算法框架;理解决策树学习算法的特征选择、树的生成和树的剪枝;能根据不同的数据类型,选择不同的决策树算法;针对特定应用场景......