这个算法实现起来相对比较简单,有个原则,最小生成树是权值最小的边构成的。
那么每次都找最小的一条边就可以了,只要不构成环就行了。那么对边进行排序,然后判断把边加入最小树中是否构成环,即并查集的思想。
没有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();
}