算法与数据结构(30)—— Kruskal实现最小生成树

这个算法实现起来相对比较简单,有个原则,最小生成树是权值最小的边构成的。

那么每次都找最小的一条边就可以了,只要不构成环就行了。那么对边进行排序,然后判断把边加入最小树中是否构成环,即并查集的思想。

没有Prim的高效,但是思想比较简单,也容易实现。


 public KruskalMST(WeightedGraph graph){
        mst = new ArrayList<Edge<Weight>>();
        MinHeap<Edge<Weight>> pq = new MinHeap<Edge<Weight>>( graph.E() );
        for( int i = 0 ; i < graph.V() ; i ++ )
            for( Object item : graph.adj(i) ){
                Edge<Weight> e = (Edge<Weight>)item;
                if( e.v() <= e.w() )
                    pq.insert(e);
            }
        UnionFind uf = new UnionFind(graph.V());
        while( !pq.isEmpty() && mst.size() < graph.V() - 1 ){
            Edge<Weight> e = pq.extractMin();
            if( uf.isConnected( e.v() , e.w() ) )
                continue;
            mst.add( e );
            uf.unionElements( e.v() , e.w() );
        }

        mstWeight = mst.get(0).wt();
        for( int i = 1 ; i < mst.size() ; i ++ )
            mstWeight = mstWeight.doubleValue() + mst.get(i).wt().doubleValue();
    }



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值