package graphtea.extensions.reports.hamilton;
import java.util.Arrays;
/**
* Created by rostam on 27.01.15.
* Hamiltonian Cycle
*/
public class HamiltonianCycle
{
private boolean seen(int v) {
for (int i = 0; i < cycleSize - 1; i++)
if (cycle[i] == v)
return true;
return false;
}
int[] HamiltonCycle(int[][] g) {
numOfVertices = g.length;
cycle = new int[numOfVertices];
Arrays.fill(cycle, -1);
adjMat = g;
try {
cycle[0] = 0;
cycleSize = 1;
dfs(0);
return null;
} catch (Exception e) {
return cycle;
}
}
public void dfs(int startingVertex) throws Exception {
if (adjMat[startingVertex][0] == 1 && cycleSize == numOfVertices)
throw new Exception("Solution found");
if (cycleSize == numOfVertices)
return;
for (int aVertex = 0; aVertex < numOfVertices; aVertex++) {
if (adjMat[startingVertex][aVertex] == 1) {
cycle[cycleSize++] = aVertex;
adjMat[startingVertex][aVertex] = 0;
adjMat[aVertex][startingVertex] = 0;
if (!seen(aVertex))
dfs(aVertex);
adjMat[startingVertex][aVertex] = 1;
adjMat[aVertex][startingVertex] = 1;
cycle[--cycleSize] = -1;
}
}
}
private int numOfVertices;
private int cycleSize;
private int[] cycle;
private int[][] adjMat;
}