package GKA.Graph; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.HashSet; import java.util.List; import java.util.Set; public class MinimumSpanningTree { private final GKAGraphInterface minimumSpanningTree = GKAGraphInterface.newGraph(GraphType.UndirectedWeighted); private final Set<GKAEdge> edgeSet = new HashSet<>(); public MinimumSpanningTree(GKAGraphInterface graph){ generateMinimumSapnningTree(graph); } public GKAGraphInterface getMinimumSpanningTree() { return minimumSpanningTree; } public double getLength(){ double retVal = 0.0; for(GKAEdge edge: edgeSet){ retVal += edge.getWeight(); } return retVal; } private void generateMinimumSapnningTree(GKAGraphInterface graph){ List<GKAEdge> edges = new ArrayList<>(graph.getjGraph().edgeSet()); edges.sort(new Comparator<GKAEdge>() { @Override public int compare(GKAEdge o1, GKAEdge o2) { return o1.getWeight().compareTo(o2.getWeight()); } }); for(String v: graph.getjGraph().vertexSet()){ minimumSpanningTree.addVertex(v); } for(GKAEdge edge: edges){ if (minimumSpanningTree.shortesPathBroad(edge.getSource().toString(), edge.getTarget().toString())==null){ edgeSet.add(edge); minimumSpanningTree.addEdge(edge.getSource().toString(), edge.getTarget().toString(), null, edge.getWeight()); } } } public Set<GKAEdge> getEdgeSet() { return Collections.unmodifiableSet(edgeSet); } }