I need to check if a graph is Isomorphic by generating all permutation. I am using this permutation class and now I need to create a graph class that represents the graph as a 2D boolean array. An example would be the user entering in 2 graphs as strings
Ex."0-1 0-2 1-2 1-3 2-3" and "1-3 2-0 0-3 1-2 1-0"
Now in my constrcutor I have to break it up and put it in a 2D boolean array. How would I go about doing that?
The user could also enter in something more complicated like “0-1 1-2 2-3 3-0 0-4 0-11 1-5 1-6 2-7 2-8 3-9 3-10 4-5 6-7 8-9 10-11 4-7 4-8 5-9 5-10 6-9 6-10 7-11 8-11” and “0-1 1-2 2-3 3-0 0-4 0-7 1-4 1-5 2-5 2-6 3-6 3-7 4-8 4-9 5-9 5-10 6-10 6-11 7-8 7-11 8-9 9-10 10-11 11-8”
public class PermutationGenerator
{
// private data
private int[] perm;
private boolean first;
// constructor
public PermutationGenerator (int n)
{
perm = new int [n];
first = true;
}
public int[] next ()
{
int n = perm.length;
// starting permutation: 0 1 2 3 ... n-1
if (first)
{
first = false;
for (int i = 0 ; i < n ; i++)
perm [i] = i;
return perm;
}
// construct the next permutation
// find largest k so that perm[k] < perm[k+1]; if none, finish
int i, j, k, l;
for (k = n - 2 ; k >= 0 && perm [k] >= perm [k + 1] ; k--)
;
if (k < 0)
return null; // no more
// find largest l so that perm[k] < perm[l]
for (l = n - 1 ; l >= 0 && perm [k] >= perm [l] ; l--)
;
// swap perm[k] and perm[l]
swap (perm, k, l);
// reverse perm[k+1]...perm[n-1]
for (i = k + 1, j = n - 1 ; i < j ; i++, j--)
swap (perm, i, j);
return perm;
}
// swap a[i] and a[j]
private static void swap (int a[], int i, int j)
{
int temp = a [i];
a [i] = a [j];
a [j] = temp;
}
}
You have to create a matrix to represent your graph, as shown in this picture:
You can start by prompting the user for two nodes that are connected, e.g., 1 and 2. Then you would do
if you are taking into account the direction, which means that
1 - 2is different than2 - 1. Otherwise (a graph non-oriented), you would doDo not forget to initialize the matrix with
false, meaning (vertices not connected). Every time you want to check if verticesXandYare directly connected you just have to access the position(X,Y)of the matrix and check if it is true.If your graph is a weighted one, you need to have an additional matrix to hold the weights. Another solution is to have just one matrix of integers where
-1means not connected, andN > 0, means that a givenXandYare connected with a weightN.About the user input:
"0-1 1-2 2-3 3-0 0-4 0-11 1-5 1-6 2-7 2-8 3-9 3-10 4-5 6-7 8-9 10-11 4-7 4-8 5-9 5-10 6-9 6-10 7-11 8-11"
among others, you can use the Scanner class:
Afterwards, you have to parser your input; let us assume a fixed format that will hold the graph vertices, for example: