最小生成树-普利姆算法lazy实现

本文介绍了懒惰普利姆算法用于构造最小生成树的步骤,包括从源点开始遍历邻接表,将边加入优先队列,出队最轻边并考察其端点,直至所有边被考察。算法的时间复杂度为O(ElogE),其中E为边的数量。文章还给出了算法的实现细节和完整代码。
摘要由CSDN通过智能技术生成

算法描述

lazy普利姆算法的步骤

1.从源点s出发,遍历它的邻接表s.Adj,将所有邻接的边(crossing edges)加入优先队列Q;
2.从Q出队最轻边,将此边加入MST.
3.考察此边的两个端点,对两个端点重复第1步.

示例

从顶点0开始,遍历它的邻接表:边0-7、0-2、0-4、0-6会被加入优先队列Q.
顶点0的邻接表搜索完毕后,边0-7是最轻边,所以它会出队,并加入MST.
如下图:
这里写图片描述
边0-7出队后,开始考察边的两个端点:

顶点0已经访问过了,跳过;
顶点7还未探索,开始探索顶点7.对7的邻接表进行访问和第一步类似.
我们找到最轻边7-1并加入MST

如下图:

这里写图片描述

对每条边重复,当所有边都考察完毕,我们就得到了最小生成树,如下图:
这里写图片描述

时间复杂度

扫描所有边会耗时O(E ).
由于所有的边都会入队,优先队列调整的操作耗时O(logE ).
那lazy方式最差就是O(ElogE ).
其中E 是图的边数.

算法实现

算法的第一步,将源点s所有的邻接的边加入Q,如下:

    /**
     * 找出从源点出发的所有的crossing edges,并用一个优先队列维护他们
     *
     * 原理:
     * 将对未访问的邻接点进行遍历当作一次切断(graph-cut),则源点和邻接点间的边就是crossing edge
     * 根据贪心策略求MST的要求,要加入的边必须是最轻边(权重最小的边),
     * 故而将crossing edges加入优先队列,这样便可用O(logN)的时间找出最小权重边
     *
     * @param src 源点
     */
    private void search(int src) {
        visited[src] = true;
        for(Edge e : g.vertices()[src].Adj) {
            WeightedEdge we = (WeightedEdge)e;
            if(!visited[we.to])
                cr
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值