/* MinimumSpanningTreeKruskalAlgorithm - Decompiled by JODE
 * Visit http://jode.sourceforge.net/
 */
package salvo.jesus.graph.algorithm;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Vector;

import salvo.jesus.graph.GraphImpl;
import salvo.jesus.graph.Vertex;
import salvo.jesus.graph.WeightedEdge;
import salvo.jesus.graph.WeightedGraph;
import salvo.jesus.graph.WeightedGraphImpl;

public class MinimumSpanningTreeKruskalAlgorithm
    extends MinimumSpanningTreeAlgorithm
{
    public MinimumSpanningTreeKruskalAlgorithm(WeightedGraph weightedgraph) {
	super(weightedgraph);
    }
    
    public WeightedGraph minimumSpanningTree() {
	HashSet hashset = new HashSet();
	WeightedGraphImpl weightedgraphimpl = new WeightedGraphImpl();
	GraphImpl graphimpl = new GraphImpl();
	Vector vector = new Vector();
	Iterator iterator = wgraph.getVerticesIterator();
	while (iterator.hasNext()) {
	    Vector vector_0_ = wgraph.getEdges((Vertex) iterator.next());
	    Iterator iterator_1_ = vector_0_.iterator();
	    while (iterator_1_.hasNext())
		hashset.add((WeightedEdge) iterator_1_.next());
	}
	Vector vector_2_ = new Vector(hashset);
	Collections.sort(vector_2_, new Comparator() {
	    public int compare(Object object, Object object_4_) {
		WeightedEdge weightededge = (WeightedEdge) object;
		WeightedEdge weightededge_5_ = (WeightedEdge) object_4_;
		if (weightededge.getWeight() < weightededge_5_.getWeight())
		    return -1;
		if (weightededge.getWeight() > weightededge_5_.getWeight())
		    return 1;
		return 0;
	    }
	    
	    public boolean equals(Object object) {
		return object.equals(this);
	    }
	});
	iterator = vector_2_.iterator();
	while (iterator.hasNext()) {
	    WeightedEdge weightededge = (WeightedEdge) iterator.next();
	    Vertex vertex = weightededge.getVertexA();
	    Vertex vertex_6_ = weightededge.getVertexB();
	    if (!vector.contains(vertex)) {
		graphimpl.add(vertex);
		vector.add(vertex);
	    }
	    if (!vector.contains(vertex_6_)) {
		graphimpl.add(vertex_6_);
		vector.add(vertex_6_);
	    }
	    if (!graphimpl.isConnected(vertex, vertex_6_)) {
		graphimpl.addEdge(vertex, vertex_6_);
		weightedgraphimpl.addEdge(weightededge);
	    }
	}
	Object object = null;
	return weightedgraphimpl;
    }
}
