/* This program and the accompanying materials are dual-licensed under
* either
*
* (a) the terms of the GNU Lesser General Public License version 2.1
* as published by the Free Software Foundation, or (at your option) any
* later version.
*
* or (per the licensee's choosing)
*
* (b) the terms of the Eclipse Public License v1.0 as published by
* the Eclipse Foundation.
*/
/**
*
*/
package org.jgrapht.experimental.alg.color;
import java.util.*;
import org.jgrapht.*;
import org.jgrapht.experimental.alg.*;
/**
* @author micha
*/
public class BrownBacktrackColoring<V, E>
extends IntArrayGraphAlgorithm<V, E>
implements ExactAlgorithm<Integer, V>
{
private int [] _color;
private int [] _colorCount;
private BitSet [] _allowedColors;
private int _chi;
/**
* @param g
*/
public BrownBacktrackColoring(final Graph<V, E> g)
{
super(g);
}
void recursiveColor(int pos)
{
_colorCount[pos] = _colorCount[pos - 1];
_allowedColors[pos].set(0, _colorCount[pos] + 1);
for (int i = 0; i < _neighbors[pos].length; i++) {
final int nb = _neighbors[pos][i];
if (_color[nb] > 0) {
_allowedColors[pos].clear(_color[nb]);
}
}
for (
int i = 1;
(i <= _colorCount[pos])
&& (_colorCount[pos] < _chi);
i++)
{
if (_allowedColors[pos].get(i)) {
_color[pos] = i;
if (pos < (_neighbors.length - 1)) {
recursiveColor(pos + 1);
} else {
_chi = _colorCount[pos];
}
}
}
if ((_colorCount[pos] + 1) < _chi) {
_colorCount[pos]++;
_color[pos] = _colorCount[pos];
if (pos < (_neighbors.length - 1)) {
recursiveColor(pos + 1);
} else {
_chi = _colorCount[pos];
}
}
_color[pos] = 0;
}
/* (non-Javadoc)
* @see org.jgrapht.experimental.alg.ExactAlgorithm#getResult()
*/
public Integer getResult(Map<V, Object> additionalData)
{
_chi = _neighbors.length;
_color = new int[_neighbors.length];
_color[0] = 1;
_colorCount = new int[_neighbors.length];
_colorCount[0] = 1;
_allowedColors = new BitSet[_neighbors.length];
for (int i = 0; i < _neighbors.length; i++) {
_allowedColors[i] = new BitSet(1);
}
recursiveColor(1);
if (additionalData != null) {
for (int i = 0; i < _vertices.size(); i++) {
additionalData.put(_vertices.get(i), _color[i]);
}
}
return _chi;
}
}
// End BrownBacktrackColoring.java