Index: src/main/java/weka/clusterers/forMetisMQI/Coarse.java
===================================================================
--- src/main/java/weka/clusterers/forMetisMQI/Coarse.java	(revision 7)
+++ src/main/java/weka/clusterers/forMetisMQI/Coarse.java	(revision 8)
@@ -13,5 +13,5 @@
 	private static boolean debug = true;
 	private static PrintStream debugStream = System.err;
-	private static int nodesContracted = 5;
+	private static int finerSize = 5;
 
 	/**
@@ -61,6 +61,8 @@
 					map.set(g.getIndex(matchedNode), labelCounter);
 					if(debug) debugStream.println("Contracting node " + u + " with " + matchedNode + ". Node id: " + getMappedNode(g, map, u));
-				} else
+				} else {
 					map.set(g.getIndex(u), labelCounter);
+					if(debug) debugStream.println("Node " + u + " with " + " new node id: " + getMappedNode(g, map, u));
+				}
 				labelCounter++;
 			}
@@ -106,5 +108,6 @@
 		//calcolo dei pesi del nuovo grafo: per ogni arco (u,v) && u < v.
 		//w(map(u),map(v)) += w(u,v). 
-		for(int u=0; u < g.size(); u++) {
+		for(int i=0; i < g.size(); i++) {
+			int u = g.getLabel(i);
 			Iterator<Integer> it = g.getNeighbors(u).iterator();
 			while(it.hasNext()) {
@@ -115,5 +118,6 @@
 			}
 		}
-		for(int u = 0; u < g.size(); u++) {
+		for(int i=0; i < g.size(); i++) {
+			int u = g.getLabel(i);
 			if(isMatched(g,match,u)) {
 				int v = getMatchedNode(g,match,u);
@@ -159,6 +163,10 @@
 	    	if(debug)
 	    		debugStream.println("-----------------------------------------------------");
-	    } while(e.getProjected().size() > e.getContracted().size() && e.getContracted().size() > nodesContracted);
+	    } while(e.getProjected().size() > e.getContracted().size() && e.getContracted().size() > finerSize);
 	    return stack;
 	}
+
+	public static void setFinerSize(int i) {
+		finerSize = i;
+	}
 }
Index: src/main/java/weka/clusterers/forMetisMQI/Edge.java
===================================================================
--- src/main/java/weka/clusterers/forMetisMQI/Edge.java	(revision 8)
+++ src/main/java/weka/clusterers/forMetisMQI/Edge.java	(revision 8)
@@ -0,0 +1,53 @@
+package weka.clusterers.forMetisMQI;
+
+public class Edge {
+	
+	private String id;
+	
+	private int weight;
+	
+	private int capacity;
+	
+	public Edge(String id, int weight, int capacity) {
+		this.id = id;
+		this.weight = weight;
+		this.capacity = capacity;
+	}
+	
+	@Override
+	public int hashCode() {
+		int hash = 1;
+		hash = hash * 31 + id.hashCode();
+		return hash;
+	}
+	
+	@Override
+	public boolean equals(Object o) {
+		boolean result = (o instanceof Edge);
+		if(result) {
+			Edge e = (Edge) o;
+			result = result && (e.getId().equals(id));
+			result = result && (e.getWeight() == weight);
+			result = result && (e.getCapacity() == capacity);
+		}
+		return result;
+	}
+
+	public String getId() {
+		return id;
+	}
+	
+	public int getWeight() {
+		return weight;
+	}
+	
+	public int getCapacity() {
+		return capacity;
+	}
+	
+	@Override
+	public String toString() {
+		return "E" + id;
+	}
+
+}
Index: src/main/java/weka/clusterers/forMetisMQI/GraphAlgorithms.java
===================================================================
--- src/main/java/weka/clusterers/forMetisMQI/GraphAlgorithms.java	(revision 7)
+++ src/main/java/weka/clusterers/forMetisMQI/GraphAlgorithms.java	(revision 8)
@@ -23,4 +23,5 @@
 	public void METIS(Graph g) {
 		KLPartition partition = null;
+		Coarse.setFinerSize(10);
 		Stack<CoarserGraphElement> stack = Coarse.coarse(g);
 		
@@ -32,4 +33,6 @@
 		}
 		
+		MQI.start(partition);
+		
 	}
 
Index: src/main/java/weka/clusterers/forMetisMQI/KLPartition.java
===================================================================
--- src/main/java/weka/clusterers/forMetisMQI/KLPartition.java	(revision 7)
+++ src/main/java/weka/clusterers/forMetisMQI/KLPartition.java	(revision 8)
@@ -33,10 +33,13 @@
 		a = new Subgraph(g);
 		b = new Subgraph(g);
-		Random r = Random.instance();
-		for(int i=0;i<g.size();i++) {
-			if(r.nextBoolean())
-				a.addNode(g.getLabel(i));
+		Iterator<Integer> graph = g.vtxsPermutation().iterator();
+		int i = 0;
+		while(graph.hasNext()) {
+			int u = graph.next();
+			if((i%2)==0)
+				a.addNode(u);
 			else
-				b.addNode(g.getLabel(i));
+				b.addNode(u);
+			i++;
 		}
 		marked = new ArrayList<Integer>();
Index: src/main/java/weka/clusterers/forMetisMQI/MQI.java
===================================================================
--- src/main/java/weka/clusterers/forMetisMQI/MQI.java	(revision 8)
+++ src/main/java/weka/clusterers/forMetisMQI/MQI.java	(revision 8)
@@ -0,0 +1,97 @@
+package weka.clusterers.forMetisMQI;
+
+import java.awt.Dimension;
+import java.util.Iterator;
+
+import javax.swing.JFrame;
+
+import edu.uci.ics.jung.algorithms.layout.CircleLayout;
+import edu.uci.ics.jung.algorithms.layout.Layout;
+import edu.uci.ics.jung.graph.DirectedSparseGraph;
+import edu.uci.ics.jung.graph.Graph;
+import edu.uci.ics.jung.visualization.BasicVisualizationServer;
+import edu.uci.ics.jung.visualization.decorators.ToStringLabeller;
+
+public class MQI {
+	
+	public static void viewGraph(Graph<Node, Edge> g){
+		Layout<Node, Edge> layout = new CircleLayout<Node, Edge>(g);
+		layout.setSize(new Dimension(300,300)); // sets the initial size of the space
+		// The BasicVisualizationServer<V,E> is parameterized by the edge types
+		BasicVisualizationServer<Node,Edge> vv =
+		new BasicVisualizationServer<Node,Edge>(layout);
+		vv.setPreferredSize(new Dimension(350,350)); //Sets the viewing area size
+		vv.getRenderContext().setVertexLabelTransformer(new ToStringLabeller<Node>());
+		JFrame frame = new JFrame("Simple Graph View");
+		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
+		frame.getContentPane().add(vv);
+		frame.pack();
+		frame.setVisible(true);
+	}
+	
+	static public void start(KLPartition partition) {
+		Subgraph A = null;
+		Subgraph B = null;
+		if(partition.getSubgraph().size() > partition.getComplement().size()) {
+			A = partition.getSubgraph();
+			B = partition.getComplement();
+		}
+		else {
+			A = partition.getComplement();
+			B = partition.getSubgraph();
+		}
+		int a = A.size();
+		int c = partition.edgeCut();
+		
+		
+		Graph<Node,Edge> g = new DirectedSparseGraph<Node, Edge>();
+		Iterator<Integer> nodes =  A.iterator();
+		while(nodes.hasNext()) {
+			int u = nodes.next();
+			g.addVertex(new Node(Integer.toString(u)));
+		}
+		
+		nodes =  A.iterator();
+		int id = 0;
+		while(nodes.hasNext()) {
+			int u = nodes.next();
+			Iterator<Integer> neighbors = A.getNeighbours(u).iterator();
+			while(neighbors.hasNext()) {
+				int v = neighbors.next();
+				g.addEdge(new Edge(Integer.toString(id),A.getWeight(u, v),a),new Node(Integer.toString(u)),new Node(Integer.toString(v)));
+				id++;
+			}
+		}
+		
+		Node source = new Node("S");
+		Node sink = new Node("T");
+		g.addVertex(source);
+		g.addVertex(sink);
+		
+		
+		nodes =  B.iterator();
+		while(nodes.hasNext()) {
+			int u = nodes.next();
+			Iterator<Integer> neighbors = B.getGraph().getNeighbors(u).iterator();
+			while(neighbors.hasNext()) {
+				int v = neighbors.next();
+				if(A.contains(v)) {
+					g.addEdge(new Edge(Integer.toString(id),1,a),source,new Node(Integer.toString(v)));
+					id++;
+				}
+			}
+		}
+		
+		nodes =  A.iterator();
+		while(nodes.hasNext()) {
+			int u = nodes.next();
+			g.addEdge(new Edge(Integer.toString(id),1,c),new Node(Integer.toString(u)),sink);
+			id++;
+		}
+		
+		viewGraph(g);
+		System.out.println(g.toString());
+		
+	}
+	
+}
Index: src/main/java/weka/clusterers/forMetisMQI/Node.java
===================================================================
--- src/main/java/weka/clusterers/forMetisMQI/Node.java	(revision 8)
+++ src/main/java/weka/clusterers/forMetisMQI/Node.java	(revision 8)
@@ -0,0 +1,32 @@
+package weka.clusterers.forMetisMQI;
+
+public class Node {
+	
+	private String id;
+	
+	public Node(String id) {
+		this.id = id;
+	}
+	
+	@Override
+	public boolean equals(Object o) {
+		return (o instanceof Node) && (((Node)o).getId().equals(id));
+	}
+	
+	@Override
+	public int hashCode() {
+		int hash = 1;
+		hash = hash * 31 + id.hashCode();
+		return hash;
+	}
+
+	public String getId() {
+		return id;
+	}
+	
+	@Override
+	public String toString() {
+		return "N" + id;
+	}
+
+}
Index: src/main/java/weka/clusterers/forMetisMQI/Subgraph.java
===================================================================
--- src/main/java/weka/clusterers/forMetisMQI/Subgraph.java	(revision 7)
+++ src/main/java/weka/clusterers/forMetisMQI/Subgraph.java	(revision 8)
@@ -9,6 +9,4 @@
 import java.util.TreeSet;
 import java.util.Map.Entry;
-
-import weka.clusterers.forMetisMQI.Graph.NodeInfo;
 
 public class Subgraph {
@@ -134,4 +132,11 @@
 	}
 	
+	public int getWeight(int u, int v) {
+		int ret = -1;
+		if(isEdge(u,v))
+			ret = g.getWeight(u, v);
+		return ret;
+	}
+	
 	public Iterator<Integer> iterator() {
 		return listOfNodes.iterator();
