Aqui tratamos de grafos bipartidos, uma espécie simples, mas muito útil de grafos.
Bipartição
Um grafo é bipartido (= bipartite) se existe uma bipartição do seu conjunto de vértices tal que cada 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 é bipartido 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.
Um grafo bipartido:

Ciclos ímpares
É fácil verificar que grafos que têm ciclos de comprimento ímpar não são bipartidos. É um pouco mais difícil provar que:
todo grafo sem ciclos ímpares admite bipartição.
A função abaixo (junto com a prova de sua correção) constitui uma prova dessa fato fundamental.
A estrutura da função é de uma busca em profundidade.
Exercícios para Fixação
1. O que faz esta linha: "cor[v] = 1-c"?
2. Quais dos dois grafos abaixo são bipartidos? Para o grafo bipartido mostre as duas partições!
a) 0-1 1-2 2-3 3-0 0-4 4-5 5-2
b) 0-1 1-2 2-3 3-0 4-6 0-5 5-2
3. Diga o que a função dfsCor faz.
4. Mostre que se a função coloreGrafo devolve 0 então G tem um ciclo de comprimento ímpar.
5. Escreva essas duas funções para um grafo representando por lista de adjacências.
6. Execute o algoritmo coloreGrafo e mostre os principais passos para o grafo a seguir:
Referência: IME
Bipartição
Um grafo é bipartido (= bipartite) se existe uma bipartição do seu conjunto de vértices tal que cada 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 é bipartido 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.
Um grafo bipartido:
Ciclos ímpares
É fácil verificar que grafos que têm ciclos de comprimento ímpar não são bipartidos. É um pouco mais difícil provar que:
todo grafo sem ciclos ímpares admite bipartição.
A função abaixo (junto com a prova de sua correção) constitui uma prova dessa fato fundamental.
A estrutura da função é de uma busca em profundidade.
int G[MAXV][MAXV];//G está representando um grafo por matriz de adjancências
int n; //n é o número total de vértices (que são números de 0 a N-1)
int cor[MAXV];
//A função devolve 1 se o grafo G é bipartido e devolve 0 em caso contrário. Além disso, se G é bipartido, a função atribui uma "cor" a cada vértice de G de tal forma que toda aresta tenha pontas de cores diferentes. As cores dos vértices, 0 e 1, são registradas no vetor cor indexado pelos vértices.
int coloreGrafo(){
int v;
int c = 0; //representa a "cor"
for( v = 0 ; v < n ; ++v ) cor[v] = -1;
for( v = 0 ; v < n ; ++v )
if(cor[v] == -1)
if(dfsCor(v, 0) == 0) return 0;
return 1;
}
int dfsCor(int v, int c){
int p;
cor[v] = 1-c; //???
for( p = 0 ; p < n ; ++p ){
if(G[v][p] == 1 && cor[p] == -1){ //existe aresta e ainda não tem cor
if(dfsCor(p,1-c) == 0) return 0;
}
else if (cor[p] == 1-c) return 0;
}
return 1;
}Exercícios para Fixação
1. O que faz esta linha: "cor[v] = 1-c"?
2. Quais dos dois grafos abaixo são bipartidos? Para o grafo bipartido mostre as duas partições!
a) 0-1 1-2 2-3 3-0 0-4 4-5 5-2
b) 0-1 1-2 2-3 3-0 4-6 0-5 5-2
3. Diga o que a função dfsCor faz.
4. Mostre que se a função coloreGrafo devolve 0 então G tem um ciclo de comprimento ímpar.
5. Escreva essas duas funções para um grafo representando por lista de adjacências.
6. Execute o algoritmo coloreGrafo e mostre os principais passos para o grafo a seguir:
Referência: IME