最小生成树(MST)算法

总结自wiki
普里姆算法(Prim算法)

从单一顶点开始,普里姆算法按照以下步骤逐步扩大树中所含顶点的数目,直到遍及连通图的所有顶点。

  1. 输入:一个加权连通图,其中顶点集合为V,边集合为E;
  2. 初始化:Vnew = {x},其中x为集合V中的任一节点(起始点),Enew = {};
  3. 重复下列操作,直到Vnew = V:
    1. 在集合E中选取权值最小的边(u, v),其中u为集合Vnew中的元素,而v则不是(如果存在有多条满足前述条件即具有相同权值的边,则可任意选取其中之一);
    2. 将v加入集合Vnew中,将(u, v)加入集合Enew中;
  4. 输出:使用集合Vnew和Enew来描述所得到的最小生成树。
最小边、权的数据结构 时间复杂度(总计)
邻接矩阵、搜索O(V2)
二叉堆(后文伪代码中使用的数据结构)、邻接表O((V + E) log(V)) = O(E log(V))
斐波那契堆邻接表O(E + V log(V))


克鲁斯克尔算法(Kruskal算法)
  1. 新建图G,G中拥有原图中相同的节点,但没有边
  2. 将原图中所有的边按权值从小到大排序
  3. 从权值最小的边开始,如果这条边连接的两个节点于图G中不在同一个连通分量中,则添加这条边到图G中
  4. 重复3,直至图G中所有的节点都在同一个连通分量中
KRUSKAL-FUNCTION(G, w)
1    F := 空集合
2    for each 圖 G 中的頂點 v
3        do 將 v 加入森林 F
4    所有的邊(u, v) ∈ E依權重 w 遞增排序
5    for each 邊(u, v) ∈ E
6        do if u 和 v 不在同一棵子樹
7            then F := F ∪ {(u, v)}
8                將 u 和 v 所在的子樹合併



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值