Coloração de vértices de grafos

Uma coloração dos vértices de um grafo não-dirigido é uma atribuição de cores aos vértices que tenha a seguinte propriedade: as pontas de cada aresta têm cores diferentes. (Favor não confundir o conceito de coloração de vértices com as marcas branco, cinza, preto que usamos em outra ocasião para acompanhar a evolução de algoritmos de busca.) É evidente que um grafo admite coloração de vértices se e só se não tem laço algum.

É fácil produzir uma coloração com muitas cores: basta atribuir uma cor diferente a cada vértice. É mais difícil obter uma coloração com poucas cores.

Problema da Coloração de Vértices: Dado um grafo não-dirigido, encontrar uma coloração dos vértices com número mínimo de cores.

Dizemos que uma coloração é ótima se o número de cores é mínimo. O problema também pode ser apresentado assim:

Problema: Dado um grafo não-dirigido e um número k, encontrar uma coloração dos vértices que use k ou menos cores.

Exercícios 1

  1. Faça uma coloração ótima dos vértices do grafo complete (8). Esse é o grafo não-dirigido completo de 8 vértices. A macro complete (n) está definida no módulo GB_BASIC do SGB (bloco 7) e significa board (n, 0, 0, 0, −1, 0, 0). Por sua vez, board gera os movimentos de uma peça de xadrez (verdadeira ou imaginária) num tabuleiro (verdadeiro ou imaginário).
  2. Faça uma coloração ótima dos vértices do grafo circuit (7). Esse é o circuito não-dirigido com 7 vértices. A macro circuit (n) está definida no módulo GB_BASIC do SGB (bloco 7) e significa board (n, 0, 0, 0, 1, 1, 0).
  3. Faça uma coloração ótima dos vértices do grafo disjoint_subsets (5, 2). Esse é o grafo de Petersen. A macro disjoint_subsets (n, k) está definida no módulo GB_BASIC do SGB (bloco 36) e significa subsets (k, 1, 1−n, 0, 0, 0, 1, 0).
  4. [Bom!] Encontre uma coloração ótima dos vértices do grafo product (circuit (5), circuit (3), 2, 0). A função product está definida no bloco 94 do módulo GB_BASIC do SGB.

Cobertura por conjuntos estáveis

Uma cobertura por conjuntos estáveis é uma coleção E1, E2, … , Ek de conjuntos estáveis tal que cada vértice do grafo pertence a algum Ei, ou seja, tal que a união de E1, E2, … , Ek seja o conjunto de todos os vértices do grafo. (A definição permite que um vértice pertença a dois ou mais conjuntos estáveis diferentes, ou seja, tenha duas ou mais cores diferentes. Mas isso não é importante: se Ei intersecta Ej, basta trocar Ei por EiEj e observar que esse último conjunto também é estável.)

Uma cobertura por conjuntos estáveis é o mesmo que uma coloração de vértices: cada Ei corresponde a uma cor. Portanto, nosso problema pode ser reformulado assim:

Problema da Coloração de Vértices: Cobrir um grafo não-dirigido com o menor número possível de conjuntos estáveis.

Exercícios 2

  1. Suponha que cada vértice v de um grafo não-dirigido tem uma cor vcor (os valores possíveis de cor são 0, 1, 2, etc.). Escreva uma função C que decide se os rótulos definem uma coloração dos vértices. Em caso afirmativo, a função deve devolver o número de cores usadas pela coloração.
  2. Suponha que E1, E2, … , Ek é uma cobertura de um grafo não-dirigido por conjuntos estáveis. É verdade que cada Ei é um conjunto estável máximo? É verdade que cada Ei é um conjunto estável maximal?
  3. [Simples mas importante] Suponha que nosso grafo tem uma clique com k vértices. Mostre que toda coloração dos vértices usa pelo menos k cores. Em outras palavras, mostre que em qualquer grafo, o número de cores de qualquer coloração é maior ou igual que o tamanho de qualquer clique. Dê exemplos de grafos em que o número de cores de uma coloração ótima é estritamente maior que o tamanho da maior clique.
  4. Discuta o seguinte algoritmo. Ele resolve o problema da coloração com número mínimo de cores?

    for (v = v0; v < vn; v++) vcor = 1;

    k = 0;

    do {

    flag = 0;

    k++;

    for (v = v0; v < vn; v++) {

    if (vcork) continue;

    for (a = varcs; aNULL; a = anext) {

    if (atipcork) {

    atipcor = k+1;

    flag = 1; } } }

    } while (flag ≡ 1);

Heurísticas

Não conheço um algoritmo eficiente que resolva o problema da coloração ótima de qualquer grafo não-dirigido. Mas posso tentar algumas heurísticas, ou seja, métodos que às vezes produzem colorações com poucas cores, mas não oferecem nenhuma garantia disso.

A base de muitas heurísticas é o seguinte método de coloração sequencial dos vértices. Suponha dada uma enumeração dos vértices do grafo, ou seja, uma sequência v[0], v[1], … , v[n−1] em que cada vértice aparece uma e uma só vez. (Essa enumeração não tem relação alguma com a ordem em que os vértices aparecem no vetor gvertices da estrutura de dados do SGB.) Para encontrar uma coloração dos vértices a partir dessa enumeração basta fazer o seguinte (supondo que o grafo não tem laços):

k = 0

para j = 0 até n−1 faça

D = {1, … , k}

para i = 0 até j − 1 faça

se v[i] é adjacente a v[ j]

então D = D − { cor[v[i]] }

se D não é vazio

então cor[v[ j]] = min D

senão k = k+1

senão cor[v[ j]] = k

No início de cada execução do bloco de linhas 3-10, temos cores 1, … , k e os vértices v[0], v[1], … , v[ j−1] já estão coloridos. O bloco de linhas 4-10 atribui a menor cor possível a v[ j].

Exercícios 3

  1. Implemente uma versão do método de coloração sequencial de vértices. Use a ordem em que os vértices aparecem no vetor gvertices da estrutura de dados do SGB. Suponha que o grafo não tem laços (o usuário terá que verificar essa condição antes de chamar a função).
  2. Implemente o método de coloração sequencial de vértices. A enumeração dos vértices que servirá de base para a coloração é v, vprox, vproxprox, etc.
  3. Suponha dado um grafo não-dirigido sem laços. Suponha que v[0], v[1], … , v[n−1] é uma enumeração dos vértices em ordem decrescente de graus. (Pensando bem, número de vizinhos é mais relevante e mais apropriado que grau.) A método sequencial produz uma coloração ótima? E se os vértices estiverem em ordem crescente de graus?
  4. [Importante] Suponha que nosso grafo não tem laços. Mostre que o método de coloração sequencial, aplicado a qualquer enumeração dos vértices, usa no máximo Delta + 1 cores, sendo Delta o grau de um vértice de grau máximo (Delta = maxv g(v)). É fácil mostrar algo melhor: que o número de cores não passa de Viz + 1, onde Viz = maxv viz(v) e viz(v) é o número de vizinhos do vértice v.
  5. [Bom] Suponha que meu grafo não tem laços e que cada componente do grafo tem um vértice com menos que Viz vizinhos, sendo Viz o número máximo de vizinhos de um vértice. Escreva uma função C que produza uma coloração dos vértices do grafo com Viz ou menos cores. (Sugestão: Encontre uma enumeração v[0], v[1], … , v[n−1] dos vértices tal que o número de vizinhos de v[i] em v[0], v[1], … , v[i−1] seja estritamente menor que Viz. Em seguida, faça uma coloração sequencial.)
  6. [Ordenação por grau relativo] Suponha que a enumeração v[0], v[1], … , v[n−1] dos vértices de um grafo não-dirigido sem laços tenha a seguinte propriedade: para cada j, v[ j] é um vértice com o menor número possível de vizinhos em { v[0], v[1], … , v[ j−1] } é mínimo. Escreva uma função C que gere uma enumeração com essa propriedade e em seguinda faça uma coloração sequencial. Essa heurística produz uma coloração ótima?
  7. Gere a enumeração dos vértices aleatoriamente e depois aplique o método de coloração sequencial.