montei um código aqui, porém não usei recursão…:
veja se clareia um pouco as idéias e veja também se o resultado esta correto:
Classe Vertice:
[code]package v.coloring;
import java.util.ArrayList;
public class Vertice {
public int ID;
public int cor;
public ArrayList<Vertice> vizinhos;
public Vertice(int ID) {
this.ID = ID;
this.cor = -1;
this.vizinhos = new ArrayList<Vertice>();
}
public void addVizinho(Vertice vizinho) {
this.vizinhos.add(vizinho);
}
public void mostraVizinhos() {
for (int contador = 0; contador < vizinhos.size(); contador++) {
System.out.print("ID: " + vizinhos.get(contador).ID + " - cor: " + vizinhos.get(contador).cor + "; " );
}
System.out.println();
}
}[/code]
Código Main
[code]package v.coloring;
import java.util.ArrayList;
public class VColoring {
public static Vertice[] ColorirGrafo(Vertice Vertices[],int cores[]) {
for(int i=0;i<Vertices.length;i++){
Vertices[i] = ColorirVertice(Vertices[i],cores);
}
return Vertices;
}
public static Vertice ColorirVertice(Vertice verticeAtual, int cores[]) {
Integer corDisponivel = null;
for (int i = 0; i < cores.length; i++) {
if (CorDisponivel(i, verticeAtual.vizinhos)) {
verticeAtual.cor = i;
}
}
return verticeAtual;
}
public static Boolean CorDisponivel(int cor, ArrayList<Vertice> vizinhos) {
Boolean disponivel = true;
for (Vertice vizinho : vizinhos) {
if (vizinho.cor == cor) {
disponivel = false;
}
}
return disponivel;
}
public static void main(String args[]) {
int numeroVertices = 5;
int grafo[][] = {/*0*/{0, 1, 1, 1, 1}, //vértices ligados ao vértice 0: 1,2,3,4
/*1*/ {1, 0, 0, 0, 1}, //vértices ligados ao vértice 1: 0,4
/*2*/ {1, 0, 0, 0, 0}, //vértices ligados ao vértice 2: 0
/*3*/ {1, 0, 0, 0, 1}, //vértices ligados ao vértice 3: 0,4
/*4*/ {1, 1, 0, 1, 0} //vértices ligados ao vértice 4: 0,1,3
};
int cores[] = new int[4];
for (int contador = 0; contador < 4; contador++) {
cores[contador] = contador;
}
Vertice vertices[] = new Vertice[numeroVertices];
Vertice vertice = null;
for (int linha = 0; linha < numeroVertices; linha++) {
vertice = new Vertice(linha);
vertices[linha] = vertice;
}
for (int linha = 0; linha < numeroVertices; linha++) {
for (int coluna = 0; coluna < numeroVertices; coluna++) {
if (grafo[linha][coluna] != 0) {
vertices[linha].addVizinho(vertices[coluna]);
}
}
}
for (int contador = 0; contador < numeroVertices; contador++) {
System.out.print("ID: " + vertices[contador].ID + "\n");
System.out.print("Cor: " + vertices[contador].cor + "\n");
System.out.print("Vizinhos: ");
vertices[contador].mostraVizinhos();
System.out.println();
}
System.out.println("-------------------------------------------------");
//processamento aqui
Vertice VerticesPintados[] = ColorirGrafo(vertices, cores);
for (int contador = 0; contador < numeroVertices; contador++) {
System.out.print("ID: " + VerticesPintados[contador].ID + "\n");
System.out.print("Cor: " + VerticesPintados[contador].cor + "\n");
System.out.print("Vizinhos: ");
VerticesPintados[contador].mostraVizinhos();
System.out.println();
}
}
}[/code]
Resultado:
ID: 0
Cor: 3
Vizinhos: ID: 1 - cor: 2; ID: 2 - cor: 2; ID: 3 - cor: 2; ID: 4 - cor: 1;
ID: 1
Cor: 2
Vizinhos: ID: 0 - cor: 3; ID: 4 - cor: 1;
ID: 2
Cor: 2
Vizinhos: ID: 0 - cor: 3;
ID: 3
Cor: 2
Vizinhos: ID: 0 - cor: 3; ID: 4 - cor: 1;
ID: 4
Cor: 1
Vizinhos: ID: 0 - cor: 3; ID: 1 - cor: 2; ID: 3 - cor: 2;