Um grafo simétrico é biparticionável se os seus vértices podem ser particionas em conjuntos X e Y tal que cada aresta do grafo tem uma ponta em X e outra em Y.
PROBLEMA. Determinar se um grafo simétrico dado é biparticionável.
Um grafo bipartido é um grafo biparticionável junto com uma bipartição X e Y tal que cada aresta do grafo tem uma ponta em X e outra em Y.
Se um grafo dado é biparticionável uma função pode devolvel uma bipartição de seus vértices que comprovem esse fato. Já, se o grafo não é biparticionável um ciclo com um número ímpar de arcos é uma prova desse fato.
A função abaixo recebe um grafo g e devolve TRUE se o grafo é biparticionável e FALSE em caso contrário. Se o grafo é biparticionável então os conjuntos
são uma prova desse fato.X = { v : v->parte == 0} e Y = { v : v->parte == 1} 
#define estado z.I
#define parte  y.I
typedef enum {FALSE, TRUE} Boolean;
enum {NAOVISTO, VISITADO, EXAMINADO};
Boolean tem_ciclo_impar (Vertex *r);
  /*
   * função que devolve TRUE se r é ponta de um "6" ímpar.
   */
Boolean
bipartido (Graph *g)
{
  Vertex *v0 = g->vertices;
  Vertex *vn = g->vertices + g->n;
  Vertex *v;
  for (v = v0; v < vn; v++)
    {
       v->estado = NAOVISTO;
    }
  for (v = v0; v < vn; v++)
    {
      if (v->estado == EXAMINADO) continue;
      v->parte = 0;
      if (tem_ciclo_impar(v) == TRUE) return FALSE;
    }
  return TRUE;
}
Boolean
tem_ciclo_impar (Vertex *r)
{
  Arc *a;
  r->estado = VISITADO;
  for (a = r->arcs; a; a = a->next)
    {
      Vertex *v = a->tip;
      /* rv é um arco para frente (foward-arc) */
      if (v->estado == EXAMINADO) continue;
      /* rv é um arco de retorno */
      if (v->estado == VISITADO && v->parte == r->parte) continue;
      /* rv é um arco de retorno e r e v estão na mesma parte*/
      if (v->estado == VISITADO && v->parte != r->parte) return TRUE;
      /* v-estado == NAOVISTO e rv é arco da árvore */
      v->parte = (r->parte + 1) % 2;
      if (tem_ciclo_impar(v) == TRUE) return TRUE;
    } 
  r->estado = EXAMINADO;
  return FALSE;
}
Pode-se reescrever as funç~es acima apenas com o campo parte.
Página principal de Algoritmos em Grafos.
Last modified: Thu Jul 24 17:32:29 EST 2003