package com.interview.algorithms.graph; import com.interview.basics.model.collection.heap.BinaryArrayHeap; import com.interview.basics.model.collection.heap.Heap; import com.interview.basics.model.graph.WeightedGraph; import com.interview.basics.model.graph.WeightedGraph.Edge; import com.interview.algorithms.general.C1_3_UnionFind; import java.util.ArrayDeque; import java.util.ArrayList; import java.util.List; import java.util.PriorityQueue; /** * Basic Idea: * 1. sort the edge by weight in ascending order * 2. add next edge to tree T unless doing so would create a cycle. * Time: O(E log E) * If edges are already sorted, order of growth is E log* V. * * Pf. Kruskal's algorithm is a special case of the greedy MST algorithm. * Suppose Kruskal's algorithm colors the edge e = v–w black. * Cut = set of vertices connected to v in tree T. * No crossing edge is black. * No crossing edge has lower weight. * @author stefanie * */ public class C6_3_MSTSolverKruskal { public static List<Edge> getMST(WeightedGraph graph) { List<Edge> MST = new ArrayList<Edge>(); Heap<Edge> minHeap = new BinaryArrayHeap<Edge>(Heap.MIN_HEAD); for (Edge edge : graph.edges()) minHeap.add(edge); C1_3_UnionFind uf = new C1_3_UnionFind(graph.V); while (MST.size() < graph.V - 1 && minHeap.size() != 0) { Edge minEdge = minHeap.pollHead(); if (uf.connected(minEdge.s, minEdge.t)) continue; uf.union(minEdge.s, minEdge.t); MST.add(minEdge); } return MST; } }