a-maze-ing / CSE 373 PT / mazes / src / graphs / minspantrees / KruskalMinimumSpanningTreeFinder.java
KruskalMinimumSpanningTreeFinder.java
Raw
package graphs.minspantrees;

import disjointsets.DisjointSets;
import disjointsets.QuickFindDisjointSets;
import graphs.BaseEdge;
import graphs.KruskalGraph;

import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;

/**
 * Computes minimum spanning trees using Kruskal's algorithm.
 * @see MinimumSpanningTreeFinder for more documentation.
 */
public class KruskalMinimumSpanningTreeFinder<G extends KruskalGraph<V, E>, V, E extends BaseEdge<V, E>>
    implements MinimumSpanningTreeFinder<G, V, E> {

    protected DisjointSets<V> createDisjointSets() {
        return new QuickFindDisjointSets<>();
        /*
        Disable the line above and enable the one below after you've finished implementing
        your `UnionBySizeCompressingDisjointSets`.
         */
        // return new UnionBySizeCompressingDisjointSets<>();

        /*
        Otherwise, do not change this method.
        We override this during grading to test your code using our correct implementation so that
        you don't lose extra points if your implementation is buggy.
         */
    }

    @Override
    public MinimumSpanningTree<V, E> findMinimumSpanningTree(G graph) {
        // Here's some code to get you started; feel free to change or rearrange it if you'd like.

        // sort edges in the graph in ascending weight order
        List<E> edges = new ArrayList<>(graph.allEdges());
        edges.sort(Comparator.comparingDouble(E::weight));
        int vertexCount = 0;
        int edgeCount = 0;
        // create new disjoint set for each vertex
        DisjointSets<V> disjointSets = createDisjointSets();
        for (V vertex : graph.allVertices()) {
            disjointSets.makeSet(vertex);
            vertexCount++;
        }
        // connect vertices
        ArrayList<E> connectedEdges = new ArrayList<>();
        for (E edge : edges) {
            // true when merges
            if (disjointSets.union(edge.from(), edge.to())) {
                // add edge to connected edges
                connectedEdges.add(edge);
                edgeCount++;
            }
        }
        if (vertexCount == 0 || vertexCount == 1) {
            return new MinimumSpanningTree.Success<>(connectedEdges);
        }
        // check if MST exists (no connected edges or if # of edge is not # of vertices - 1)
        if (connectedEdges.size() <= 0 || edgeCount != vertexCount - 1) {
            return new MinimumSpanningTree.Failure<>();
        }
        // return MST
        return new MinimumSpanningTree.Success<>(connectedEdges);
    }
}