最小生成树python,prim

Prim算法是一种构造最小生成树的算法,通过逐步连接顶点形成最小权重的树。从任意顶点开始,每次选择与当前生成树连接的最小权值边,将新顶点加入树中,直至所有顶点都在树中。辅助数组closest和lowcost用于记录顶点最近邻接点及其最小权值。采用邻接表存储结构,方便查找和更新最小边。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1) 算法的基本思想:

普里姆算法的基本思想:普里姆算法是一种构造最小生成树的算法,它是按逐个将顶点连通的方式来构造最小生成树的。

从连通网络 N = { V, E }中的某一顶点 u0 出发,选择与它关联的具有最小权值的边(u0, v),将其顶点加入到生成树的顶点集合U中。以后每一步从一个顶点在U中,而另一个顶点不在U中的各条边中选择权值最小的边(u, v),把该边加入到生成树的边集TE中,把它的顶点加入到集合U中。如此重复执行,直到网络中的所有顶点都加入到生成树顶点集合U中为止。

假设G=(V,E)是一个具有n个顶点的带权无向连通图,T(U,TE)是G的最小生成树,其中U是T的顶点集,TE是T的边集,则构造G的最小生成树T的步骤如下:

(1)初始状态,TE为空,U={v0},v0∈V;

(2)在所有u∈U,v∈V-U的边(u,v) ∈E中找一条代价最小的边(u′,v′)并入TE,同时将v′并入U;

重复执行步骤(2)n-1次,直到U=V为止。

在普里姆算法中,为了便于在集合U和(V-U)之间选取权值最小的边,需要设置两个辅助数组closest和lowcost,分别用于存放顶点的序号和边的权值。 
对于每一个顶点v∈V-U,closest[v]为U中距离v最近的一个邻接点,即边 (v,closest[v]) 是在所有与顶点v相邻、且其另一顶点j∈U的边中具有最小权值的边,其最小权值为lowcost[v],即lowcost[v]=cost[v][closest[v]],采用邻接表作为存储结构:

设置一个辅助数组closedge[]:

lowcost域 存放生成树顶点集合内顶点到生成树外各顶点的各边上的当前最小权值;

adjvex域 记录生成树顶点集合外各顶点距离集合内哪个顶点最近(即权值最小)。 
 

from pylab import *
inf = 65535 #代表无穷大
vexs=array([[inf,6,5,inf,14,8,inf,inf],
Prim算法是一种常用的最小生成树算法,以下是一个Python实现的Prim算法。 ```python def prim(graph): """Prim算法实现最小生成树""" # 选取一个起始 start_node = list(graph.keys())[0] # 初始时所有都不在最小生成树中 in_tree = set([start_node]) # 用来记录边的权值 edges = [] # 用来记录最小生成树的总权值 total_weight = 0 # 重复进行以下步骤,直到所有都在最小生成树中 while len(in_tree) < len(graph): # 选取一个跨越最小生成树和不在最小生成树中的边的权值最小的边 min_edge = None min_weight = float('inf') for node in in_tree: for neighbor, weight in graph[node].items(): if neighbor not in in_tree and weight < min_weight: min_edge = (node, neighbor) min_weight = weight # 将该边加入最小生成树中 edges.append(min_edge) total_weight += min_weight in_tree.add(min_edge[1]) return edges, total_weight ``` 其中,`graph`参数是一个字典,表示图中的节和边。字典的键表示节,字典的值是另一个字典,表示与该节相连的所有边和权值。 例如,以下是一个简单的图的表示: ```python graph = { 'A': {'B': 2, 'C': 3}, 'B': {'A': 2, 'C': 1}, 'C': {'A': 3, 'B': 1, 'D': 4}, 'D': {'C': 4} } ``` 表示节A与节B和节C相连,边权分别为2和3;节B与节A和节C相连,边权分别为2和1;节C与节A、节B和节D相连,边权分别为3、1和4;节D与节C相连,边权为4。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值