Bicoloração de vértices de grafos

Quando dispomos de apenas duas cores, o problema da coloração dos vértices de um grafo não-dirigido é simples. O algoritmo que resolve a bicoloração é útil e importante.

Um grafo não-dirigido é bicromático (ou bipartido) se admite uma coloração dos vértices com não mais que 2 cores. (Grafos bicromáticos são usualmente desenhados de modo que os vértices de uma das cores fiquem alinhados na parte superior da figura e os da outra cor fiquem alinhados na parte inferior.)

Para provar que um grafo é bicromático, basta exibir uma bicoloração dos vértices. Mas como é possível provar que um grafo não é bicromático? É óbvio que um grafo dotado de circuito de comprimento ímpar (ou seja, comprimento 1, ou 3, ou 5, etc.) não é bicromático. É menos óbvio (mas não menos verdade) que a vale a recíproca: todo grafo não-bicromático tem um circuito ímpar. Resumindo:

Teorema: Um grafo é bicromático se e somente se não tem circuito de comprimento ímpar.

Exercícios 1

  1. Prove o teorema dos circuitos ímpares.
  2. [Importante] Escreva uma função C que receba um grafo não-dirigido e devolva 1 se o grafo é bicromático e 0 em caso contrário. No primeiro caso, a função deve também marcar cada vértice com uma de duas cores.
  3. [Continuação] Faça uma versão mais completa do exercício anterior: se o grafo não é bicromático, a função deve usar um utility field para marcar um circuito ímpar z, zprox, zproxprox, … , z.

Exercícios 2

  1. [Desafio] Escreva uma função C que (1) pinte os vértices de um grafo dado com 3 cores ou menos ou (2) diga que o grafo não admite tal coloração.