package graphtea.extensions.algorithms;
import graphtea.graph.graph.Edge;
import graphtea.graph.graph.GraphModel;
import graphtea.graph.graph.Vertex;
import graphtea.platform.core.BlackBoard;
import graphtea.plugins.algorithmanimator.core.GraphAlgorithm;
import graphtea.plugins.algorithmanimator.extension.AlgorithmExtension;
import graphtea.plugins.main.core.actions.ResetGraph;
import java.util.ArrayList;
import java.util.Iterator;
/**
* Created by rostam on 06.03.15.
* @author M. Ali Rostami
*/
public class KruskalAlgorithm extends GraphAlgorithm implements AlgorithmExtension {
public KruskalAlgorithm(BlackBoard blackBoard) {
super(blackBoard);
}
@Override
public void doAlgorithm() {
step("Start of the algorithm.") ;
ResetGraph.resetGraph(graphData.getGraph());
ArrayList<Edge> outputEdges = new ArrayList<>();
ArrayList<ArrayList<Vertex>> sets = new ArrayList<>();
GraphModel graph = graphData.getGraph();
for (Vertex v : graph) {
ArrayList<Vertex> set = new ArrayList<>();
set.add(v);
sets.add(set);
}
ArrayList<Edge> edges = new ArrayList<>(graph.getEdgesCount());
Iterator<Edge> eit = graph.edgeIterator();
while (eit.hasNext())
edges.add(eit.next());
java.util.Collections.sort(edges, (o1, o2) -> {
if (o1.getWeight() < o2.getWeight())
return -1;
else if (o1.getWeight() == o2.getWeight())
return 0;
return 1;
});
for (Edge e : edges) {
int set1 = findSet(sets, e.source);
int set2 = findSet(sets, e.target);
if (set1 != set2) {
outputEdges.add(e);
e.source.setMark(true);
e.source.setColor(2);
e.setMark(true);
e.setColor(4);
e.target.setColor(2);
e.target.setMark(true);
sets.get(set1).addAll(sets.get(set2));
sets.remove(set2);
step("New edge is marked.");
//EventUtils.algorithmStep(this,600);
}
}
step("End of the algorithm.") ;
}
@Override
public String getName() {
return "Kruskal";
}
@Override
public String getDescription() {
return "Kruskal Algorithm";
}
int findSet(ArrayList<ArrayList<Vertex>> aav, Vertex v) {
int i = -1;
for (ArrayList<Vertex> set : aav) {
++i;
if (set.contains(v))
return i;
}
return i;
}
}