最小生成树(Python实现)--kruskal算法、prim算法、破圈法

1.避圈法(Kruskal算法–加边法)
克鲁斯克尔算法原理:
按照边的从小到大取边,并入边的两个节点,在这个过程中保证并入边后不构成圈,因此也称避圈法。
算法过程:
1)先对边按权重从小到大排序;
2)取权重最小的一条边,若该边两个节点均为不同分量,则加入最小生成树;
3)以此类推,直至遍历完所有的边。
2.prim算法–加点法
算法过程:
将所有节点划分为两类:selected_node和candidate_node
1)任取一节点加入selected_node,遍历头结点在selected_node,尾节点在candidate_node的边,选取符合条件的权重最小的边,加入最小生成树;
2)将边的尾节点加入selected_node中,并在candidate_node中删除,直至candidate_node中无节点。循环条件为:所有节点都有边连接
3.破圈法实现最小生成树
在克鲁斯克尔算法基础上,我国著名数学家管梅谷教授于1975年提出了最小生成树的破圈法。
算法过程:
1)先将所有的边按权值进行降序排列.
2)之后对于取出的每一个边来说,判断其连接的两个结点是否具有圈.(即先删除次边,然后判断这两个结点是否连接,之后对删除的边进行恢复)
3)对于有圈的,将这条边删除,否则,往下查找.
4)算法结束条件:剩下的边=结点数-1.

import networkx as nx
import matplotlib.pyplot as plt
import numpy as np
from numpy import random
import
  • 11
    点赞
  • 104
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
好的,我来为您解答这个问题。 首先,Prim算法Kruskal算法都是用来生成最小生成树算法,它们的基本思想都是贪心算法。 下面分别介绍Prim算法Kruskal算法实现方法。 1. Prim算法 Prim算法的基本思想是从任意一点开始,不断选择与当前生成树相邻的最短边,直到生成一棵包含所有点的最小生成树。 下面是Prim算法Python实现: ```python def prim(graph): # 初始化节点集合、边集合和已访问的节点集合 nodes = set(graph.keys()) edges = [] visited = set() # 从任意一个节点开始 current_node = nodes.pop() visited.add(current_node) # 对每个节点进行遍历 while nodes: # 获取当前节点相邻的边集合 adjacent_edges = [(weight, current_node, node) for node, weight in graph[current_node].items() if node in nodes] # 选择最短的边 weight, from_node, to_node = sorted(adjacent_edges)[0] # 将边添加到边集合中 edges.append((from_node, to_node, weight)) # 将当前节点添加到已访问的节点集合中 visited.add(to_node) # 将当前节点设置为新的节点 current_node = to_node # 从节点集合中删除已经访问过的节点 nodes.discard(current_node) return edges ``` 2. Kruskal算法 Kruskal算法的基本思想是将所有边按照权重从小到大排序,然后依次加入生成树中,如果加入后形成环,则不加入。 下面是Kruskal算法Python实现: ```python def kruskal(graph): # 初始化节点集合、边集合和并查集 nodes = set(graph.keys()) edges = [] disjoint_set = {node: {node} for node in nodes} # 将所有边按照权重排序 sorted_edges = sorted([(weight, from_node, to_node) for from_node, adjacent_nodes in graph.items() for to_node, weight in adjacent_nodes.items()]) # 遍历所有边 for weight, from_node, to_node in sorted_edges: # 判断边的两个端点是否已经在同一个集合中 if disjoint_set[from_node] & disjoint_set[to_node]: continue # 将边添加到边集合中 edges.append((from_node, to_node, weight)) # 合并两个集合 disjoint_set[from_node] |= disjoint_set[to_node] disjoint_set[to_node] = disjoint_set[from_node] return edges ``` 以上就是Prim算法Kruskal算法Python实现。希望能对您有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值