Я пытаюсь раскрасить график на Java.
Например, у меня есть такой график:
Теперь я хочу заполнить статьи цветом 0 (красный), 1 (синий) или 2 (зеленый). Одним из возможных результатов будет:
Vertex 1 ---> Color 1
Vertex 2 ---> Color 1
Vertex 3 ---> Color 2
Vertex 4 ---> Color 0
Vertex 5 ---> Color 0
Vertex 6 ---> Color 2
Вот мой код с методом, который я нашел, который использует жадный алгоритм для окрашивания вершины
public class Graph {
int V;
int[] verticleColor;
boolean[] colorAvailable;
ArrayList<ArrayList<Integer> > adjList;
Graph(int v) {
V = v;
adjList = new ArrayList<ArrayList<Integer> >(V);
for (int i = 0; i < V+1; i++) {
adjList.add(new ArrayList<Integer>());
}
}
public void add(int x, int y) {
adjList.get(x).add(y);
adjList.get(y).add(x);
}
public void colorTheVerticle() {
verticleColor = new int[V];
for (int a = 0; a < verticleColor.length; a++) {
if (a == 0) {
verticleColor[a] = 0;
} else {
verticleColor[a] = -1;
}
}
colorAvailable = new boolean[V];
for (int b = 0; b < colorAvailable.length; b++) {
colorAvailable[b] = true;
}
for (int c = 1; c < V; c++) {
Iterator<Integer> it = adjList.get(c).iterator() ;
while (it.hasNext()) {
int i = it.next();
if (verticleColor[i-1] != -1) {
colorAvailable[verticleColor[i]] = false;
}
}
int color;
for (color = 0; color < V; color++){
if (colorAvailable[color]) {
break;
}
}
verticleColor[c] = color;
for (int d = 0; d < colorAvailable.length; d++) {
colorAvailable[d] = true;
}
}
for (int u = 1; u < V+1; u++) {
System.out.println("Vertex " + u + " ---> Color " + verticleColor[u-1]);
}
}
Проблема в том, что я получаю результат, отличный от того, на который рассчитывал:
Vertex 1 ---> Color 0
Vertex 2 ---> Color 0
Vertex 3 ---> Color 0
Vertex 4 ---> Color 1
Vertex 5 ---> Color 0
Vertex 6 ---> Color 2
Кроме того, изменение метода немного приведет к ошибке ArrayIndexOutOfBoundsException.
Небольшое объяснение было бы полезно.