Sunday, 8 April 2012

Graph - Min Cut Problem

This is little cluttered and demands cleanup. Will do shortly.

package com.me.algo.graphs;

import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.Scanner;

public class MinCut {

/**
* @param args
*/
public static void main(String[] args) {
Graph g = readGraphFromTextFile();
int totalVertices = g.getV().size();
int remainingVertices = totalVertices;
while(remainingVertices > 2){
int aRandomNumber = generateRandomInteger(0,remainingVertices-1, new Random());
Vertex selectedSource = g.getV().get(aRandomNumber);
int selectedDestination = selectedSource.getAdjList().get(0);
graphContract(g, selectedSource, selectedDestination);
remainingVertices--;
}
List<Vertex> allVertices = g.getV();
for(Vertex v : allVertices){
System.out.print(v.getNode()  );
List<Integer> adjNodes = v.getAdjList();
for(int node : adjNodes){
System.out.print(" " + node);
}
System.out.println(" Min Cut :: " + adjNodes.size());
}

}

public static void graphContract(Graph g, Vertex source, int destination ){
List<Vertex> allVertices = g.getV();
List<Integer> adjListOfSource = source.getAdjList();
for(Vertex v : allVertices){
if(v.getNode() == destination){
v.getAdjList().addAll(adjListOfSource);
}
}
for(Vertex v : allVertices){
if(v.getNode() != source.getNode()){ //source to be fused or deleted, so do not consider the source.
for(int node : adjListOfSource){
if(v.getNode() == node){
v.getAdjList().add(destination);
}
}
}
}
removeSourceEveryWhere(g, source);
removeSelfLoops(g);
}

private static void removeSourceEveryWhere(Graph g, Vertex source){
List<Vertex> allVertices = g.getV();
for(Vertex v : allVertices){
List<Integer> adjList = v.getAdjList();
List<Integer> newAdjNodes = new ArrayList<Integer>(adjList);
for(int adjNode : adjList){
if(adjNode == source.getNode()){
newAdjNodes.remove(new Integer(adjNode));
}
}
v.setAdjList(newAdjNodes);
}
allVertices.remove(source);
}

private static void removeSelfLoops(Graph g){
List<Vertex> allVertices = g.getV();
for(Vertex v : allVertices){
List<Integer> adjNodes = v.getAdjList();
List<Integer> newAdjNodes = new ArrayList<Integer>(adjNodes);
for(int adjNode : adjNodes){
if(adjNode == v.getNode()){
newAdjNodes.remove(new Integer(adjNode));
}
}
v.setAdjList(newAdjNodes);
}
}

private static Graph readGraphFromTextFile(){
//String filePath = "D:/AlgorithmSpace/Algo/src/com/me/algo/graphs/kargerAdj02.txt";
String filePath = "D:/AlgorithmSpace/Algo/src/com/me/algo/graphs/kargerAdj.txt";
Scanner scanner = null;
try{
scanner = new Scanner(new File(filePath));
}catch(FileNotFoundException fnfe){
System.out.println("File does not exist!!");
System.exit(0);
}
List<Vertex> vertices = new ArrayList<Vertex>();
while(scanner.hasNext()){
String vertexData = scanner.nextLine();
Vertex v = new Vertex();
Scanner vertexScanner = new Scanner(vertexData);
List<Integer> adjList = new ArrayList<Integer>();
boolean isNodeExtracted = false;
while(vertexScanner.hasNextInt()){
if(!isNodeExtracted){
v.setNode(vertexScanner.nextInt());
isNodeExtracted = true;
}
adjList.add(vertexScanner.nextInt());
}
v.setAdjList(adjList);
vertices.add(v);
}
scanner.close();
Graph g = new Graph();
g.setV(vertices);
return g;
}

private static int generateRandomInteger(int aStart, int aEnd, Random aRandom){
if ( aStart > aEnd ) {
throw new IllegalArgumentException("Start cannot exceed End.");
}
long range = (long)aEnd - (long)aStart + 1;
long fraction = (long)(range * aRandom.nextDouble());
int randomNumber =  (int)(fraction + aStart);
return randomNumber;
}

}

No comments:

Post a Comment