前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >加权无向图----Kruskal算法实现最小生成树

加权无向图----Kruskal算法实现最小生成树

作者头像
SuperHeroes
发布2018-05-30 17:48:01
1K0
发布2018-05-30 17:48:01
举报
文章被收录于专栏:云霄雨霁云霄雨霁

上一篇:加权无向图的实现

加权无向图----Prim算法实现最小生成树

数据结构:

  • 用一条优先队列将边按照权重从小到大排序
  • union-find数据结构来识别会形成环的边
  • 用一条队列来保存最小生成树的所有边

Kruskal算法的计算一个含V个顶点和E条边的连通加权无向图的最小生成树所需空间与E成正比,所需时间与ElogE成正比(最坏情况)。

方法:将边都添加进最小优先权队列中,每次从中取出最小的边,检查会不会与已经选出的边构成环(使用union-find算法),如果构成环,则弃掉这条边,否则将这条边加入最小生成树队列。循环执行直到最小优先权队列为空。

代码语言:javascript
复制
public class KruskalMST {
    private Queue<Edge> mst;    //用来保存最小代价生成树的队列
	
    public KruskalMST(EdgeWeightedGraph G) {
        mst = new Queue<Edge>();
        MinPQ<Edge> pq = new MinPQ<Edge>();    //最小优先权队列
        for(Edge e: G.edges())
            pq.insert(e);//将所有边添加进优先队列
        UF uf = new UF(G.V());    //union-find算法
		
        while(!pq.isEmpty() && mst.size()<G.V()-1) {
            Edge e = pq.delMin();//从优先队列得到最小的边
            int v = e.either(),w = e.other(v);//得到最小边的顶点
            if(uf.connected(v, w))	continue;//判断会不会构成环
            uf.qu_union(v,w);//合并分量
            mst.enqueue(e);//将边添加进树中
        }
    }
    public Iterable<Edge> edges(){ return mst; }
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017.12.20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档