Algoritmos em Grafos  |  Livros  |  WWW  |  Índice de Termos

 

Coloração de vértices

(Veja Graph coloring na Wikipedia.)

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 para 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. 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.

  5. Suponha que cada vértice v de um grafo não-dirigido tem uma cor  v–>cor  (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.

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.

Uma cobertura por conjuntos estáveis é o mesmo que uma coloração de vértices: cada Ei corresponde a uma cor.  [Nossa definição de cobertura permite que um vértice pertença a dois conjuntos estáveis diferentes, ou seja, tenha duas cores diferentes. Mas isso não é importante: se Ei intercepta Ej, basta trocar Ei por Ei – Ej e observar que esse último conjunto também é estável.]   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

  1. 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?

  2. [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.

  3. Discuta o seguinte algoritmo. Ele resolve o problema da coloração com número mínimo de cores?
    for (v = v0; v < vn; v++) v–>cor = 1;
    k = 0;
    do {
       flag = 0;
       k++;
       for (v = v0; v < vn; v++) {
          if (v–>cor != k) continue;
          for (a = v–>arcs; a != NULL; a = a–>next) {
             if (a–>tip–>cor == k) {
                a–>tip–>cor = k+1;
                flag = 1; } } }
    } while (flag == 1);
    

Heurísticas

Não sei escrever 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, algoritmos 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 seqüencial dos vértices. Suponha dada uma enumeração dos vértices do grafo, ou seja, uma seqüê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 g–>vertices da estrutura de dados do SGB.]   Para determinar uma coloração dos vértices a partir dessa enumeração basta fazer o seguinte (supondo que o grafo não tem laços):

0

1

2

3

4

5

6

7

8

9

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 2-9, temos cores 1, . . , k e os vértices  v[0], v[1], . . . , v[j–1]  já estão coloridos. O bloco de linhas 3-9 atribui a menor cor possível a v[j].

Exercícios

  1. Implemente uma versão do método de coloração seqüencial de vértices. Use a ordem em que os vértices aparecem no vetor g–>vertices 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 seqüencial de vértices. A enumeração dos vértices que servirá de base para a coloração é dada pela lista encadeada v, v–>prox, v–>prox–>prox, 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 seqüencial 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 seqüencial, aplicado a qualquer enumeração dos vértices, usa no máximo Delta+1 cores, onde 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: determine 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]} é estritamente menor que Viz; em seguida, faça uma coloração seqüencial.

  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 jv[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 seqüencial. 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 seqüencial.

 


URL of this site:  www.ime.usp.br/~pf/algoritmos_em_grafos/
Last modified: Wed Oct 7 13:36:52 BRT 2009
Paulo Feofiloff
IME-USP