package com.interview.algorithms.graph; import java.util.ArrayList; import java.util.List; 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; /** * Basic Idea: * Start with vertex 0 and greedily grow tree T. * Add to T the min weight edge with exactly one endpoint in T. * Repeat until V - 1 edges. * @author stefanie * */ public class C6_3_MSTSolverPrim { public static List<Edge> getMST(WeightedGraph graph){ boolean[] visited = new boolean[graph.V]; Heap<Edge> minHeap = new BinaryArrayHeap<>(Heap.MIN_HEAD); List<Edge> MST = new ArrayList<>(); visit(0, visited, graph, minHeap); while(MST.size() < graph.V - 1 && minHeap.size() != 0){ Edge minEdge = minHeap.pollHead(); if(visited[minEdge.t]) continue; MST.add(minEdge); visit(minEdge.t, visited, graph, minHeap); } return MST; } private static void visit(int v, boolean[] visited, WeightedGraph graph, Heap<Edge> minHeap){ visited[v] = true; if(graph.adj[v] != null){ for(Edge e : graph.adj[v]){ if(!visited[e.t]) minHeap.add(e); } } } }