Algoritmos para Grafos, via Sedgewick | Índice remissivo
Esta página trata de grafos bicoloridos, uma espécie simples mas muito útil de grafos. [A página é um resumo da última parte da seção 18.5, p.103-105, do livro de Sedgewick.]
Um grafo é bicolorido ou bipartido (= bipartite) se existe uma bipartição do seu conjunto de vértices tal que toda aresta tem uma ponta em uma das partes da bipartição e a outra ponta na outra parte.
Outra maneira de formular a definição: um grafo é bicolorido se for possível atribuir uma de duas cores a cada vértice de tal forma que as pontas de cada aresta tenham cores diferentes. Essa atribuição de cores é uma bicoloração do grafo.
É fácil verificar que grafos que têm ciclos de comprimento ímpar não são bicoloridos. É um pouco mais difícil provar que
todo grafo sem ciclos ímpares admite bicoloração.
A prova desse fato fundamental é o algoritmo de bicoloração que discutiremos a seguir.
O algoritmo faz uma busca em profundidade para produzir uma bicoloração do grafo ou decidir que o grafo não tem bicoloração.
/* Vamos supor que nossos grafos têm no máximo maxV vértices.
///////////////////////////////////////////////////////////*/static int color[maxV];/* A função devolve 1 se o grafo G é bicolorido e devolve 0
// em caso contrário. Além disso, se G é bicolorido, a função
// atribui uma "cor", 0 ou 1, a cada vértice de G de tal forma
// que toda aresta tenha pontas de cores diferentes. As cores
// dos vértices são registradas no vetor color indexado pelos
// vértices. (Veja programa 18.6, p.105, de Sedgewick.)
///////////////////////////////////////////////////////////*/int GRAPHtwocolor( Graph G) { Vertex v; int c = 0; for (v = 0; v < G->V; v++) color[v] = -1; for (v = 0; v < G->V; v++) if (color[v] == -1) if (dfsRcolor( G, v, 0) == 0) return 0; return 1; }
int dfsRcolor( Graph G, Vertex v, int c) { link p; color[v] = 1-c; for (p = G->adj[v]; p != NULL; p = p->next) { Vertex w = p->w; if (color[w] == -1) { if (dfsRcolor( G, w, 1-c) == 0) return 0; } else if (color[w] == 1-c) return 0; } return 1; }
Se a função GRAPHtwocolor devolve 1 então é claro que G é bicolorido e o vetor color registra uma bicoloração. Resta mostrar que se a função devolve 0 então G tem um um ciclo de comprimento ímpar e portanto não admite bicoloração. Veja o exercício abaixo.
0-1 1-2 2-3 3-0 0-4 4-5 5-2
0-1 1-2 2-3 3-0 4-6 0-5 5-2
Quanto tempo a função GRAPHtwocolor consome quando aplicada a um grafo com V vértices e E arestas? A função consome tempo proporcional a V+E no pior caso. Ela é, portanto, linear.