最小生成树--Prim算法(Python)

1、Prim算法原理
  Prim算法在找当前最近顶点时使用到了贪婪算法。Prim算法从任意一个顶点开始,每次选择一个与当前顶点集最近的一个顶点,并将两顶点之间的边加入到树中,直到当前顶点集顶点个数为n或者树中边数为n-1。
2、实战演练
  下面给出一个无向图G=(VE,我们使用Prim算法来找它的最小生成树。
  第一步,我们先随意选择一个顶点作为起始点(起始点的选取不会影响最小生成树结果),在此我们一般选择v1作为起始点,现在我们设当前所找到最小生成树里面的顶点为集合V’,所找到的边为集合E’。初始状态如下:V’={v1}; E’={}
在这里插入图片描述

  第二步,查找顶点在V’ ={v1},V-V’ 集合中的最小权值,如下图,在红线相交的线上找最小值。通过图中我们可以看到边(v1,v8)的权值最小为2,那么将v8加入到V’,边(v1,v8)加入到 E’。 此时状态如下:V’={v1,v8}; E’={(v1,v8)}。
在这里插入图片描述
  第三步,查找顶点在V’={v1,v8},V-V’ 集合中的最小权值,如下图,在红线相交的线上找最小值。通过图中我们可以看到边(v8,v9)的权值最小为4,那么将v9加入到V’,边(v8,v9)加入到 E’。 此时状态如下:V’ ={v1,v8,v9}; E’={(v1,v8),(v8,v9)}。
在这里插入图片描述
  第四步,查找顶点在V’ ={v1,v8,v9},V-V’ 集合中的最小权值,如下图,在红线相交的线上找最小值。通过图中我们可以看到边(v9,v2)的权值最小为1,那么将v2加入到V’,边(v9,v2)加入到 E’。 此时状态如下:V’={v1,v8,v9,v2}; E’={(v1,v8),(v8,v9),(v9,v2)}。
在这里插入图片描述
  以此类推,直到找到所有顶点为止,最后得到无向图G的最小生成树MST=(V’E’,如下图所示:
在这里插入图片描述
3、Python实现

#Prim algorithm(python)
from collections import defaultdict
from heapq import heapify, heappush, heappop
import time
start = time.perf_counter()
def Prim(nodes, edges):
    '''  基于最小堆实现的Prim算法  '''
    element = defaultdict(list
Prim算法是一种用于求解图中最小生成树的经典算法,它适用于无向连接的加权图。在Python中实现Prim算法通常会使用优先队列数据结构,如`heapq`模块。以下是Prim算法的基本步骤: 1. **初始选择**:从图中的任意一个顶点开始(通常是权重最低的边),将其添加到已选集合中,并记录其邻接点。 2. **扩展过程**:对于未加入已选集合的每个顶点,检查它与已选集合中的某个顶点相连的一条边,取这条边的权重最小的。将这条边以及与其相连的那个顶点加入到已选集合中。 3. **重复**:重复步骤2,直到所有顶点都被包含在已选集合中,或者无法找到更优的边(这时已选集合构成的就是最小生成树)。 4. **结束**:最后得到的已选集合中的边就是最小生成树的所有边。 ```python import heapq def prim(graph, start): visited = {start: 0} edges = [] for node in graph.keys(): if node != start: edges.append((graph[start][node], node)) heap = [(weight, node) for weight, node in edges] heapq.heapify(heap) min_cost = 0 while heap: weight, node = heapq.heappop(heap) if node not in visited: visited[node] = weight for neighbor, edge_weight in graph[node].items(): if neighbor not in visited: heapq.heappush(heap, (edge_weight, neighbor)) min_cost += edge_weight return min_cost, visited # 示例图 graph = { 'A': {'B': 1, 'C': 5}, 'B': {'A': 1, 'D': 6, 'E': 2}, 'C': {'A': 5, 'D': 1}, 'D': {'B': 6, 'C': 1, 'E': 7, 'F': 9}, 'E': {'B': 2, 'D': 7, 'F': 3}, 'F': {'D': 9, 'E': 3} } start_node = 'A' min_cost, tree = prim(graph, start_node) print(f"最小生成树总成本: {min_cost}") print("生成树节点关系:", tree)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值