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;