Data Structures, Algorithms, & Applications in Java
Chapter 21, Exercise 13
The back tracking codes for the max
clique and max independent set problems are closely related.
The code is given below. Changes, other than those to the documentation
and method names, made to the code for the max clique problem are
shown in red.
public class AdjacencyGraphWithMaxIndependentSet extends AdjacencyGraph
{
// constructors
public AdjacencyGraphWithMaxIndependentSet(int theVertices)
{super(theVertices);}
public AdjacencyGraphWithMaxIndependentSet()
{this(0);}
// class data members used by backtracking max independent set
static int [] currentIndependentSet;
static int sizeOfCurrentIndependentSet;
static int sizeOfMaxIndependentSetSoFar;
static int [] maxIndependentSetSoFar;
/** solve max-independent-set problem using backtracking
* return size of max independent set
* param maxIndependentSet set maxIndependentSet[i] = 1
* iff i is in max independent set */
public int btMaxIndependentSet(int [] maxIndependentSet)
{
// initialize for rIndependentSet
currentIndependentSet = new int [n + 1];
sizeOfCurrentIndependentSet = 0;
sizeOfMaxIndependentSetSoFar = 0;
maxIndependentSetSoFar = maxIndependentSet;
// find max independent set
rIndependentSet(1);
return sizeOfMaxIndependentSetSoFar;
}
/** recursive backtracking code to compute largest independent set */
private void rIndependentSet(int currentLevel)
{
if (currentLevel > n)
{// at leaf, found a larger independent set
// update maxIndependentSetSoFar and sizeOfMaxIndependentSetSoFar
for (int j = 1; j <= n; j++)
maxIndependentSetSoFar[j] = currentIndependentSet[j];
sizeOfMaxIndependentSetSoFar = sizeOfCurrentIndependentSet;
return;
}
// not at leaf, see if vertex currentLevel is connected to any vertex
// in current independent set
boolean connected = false;
for (int j = 1; j < currentLevel; j++)
if (currentIndependentSet[j] == 1 && a[currentLevel][j])
{// vertex currentLevel is connected to vertex j
connected = true;
break;
}
if (!connected)
{// try currentIndependentSet[currentLevel] = 1
// add vertex currentLevel to independent set
currentIndependentSet[currentLevel] = 1;
sizeOfCurrentIndependentSet++;
rIndependentSet(currentLevel + 1);
sizeOfCurrentIndependentSet--;
}
if (sizeOfCurrentIndependentSet + n - currentLevel
> sizeOfMaxIndependentSetSoFar)
{// try currentIndependentSet[currentLevel] = 0
currentIndependentSet[currentLevel] = 0;
rIndependentSet(currentLevel + 1);
}
}
}