Solução Informática – Nivel Intermediário – Semana 3

por

Solução por Thiago Mota

Conhecimento prévio necessário:

Vamos interpretar a mesa do problema como um grafo. O problema pede para determinarmos se é possível dividir a mesa em dois lados disjuntos de tal forma que cada vértice de um lado só possua arestas com vértices do outro lado. Grafos com essa propriedade são chamados Grafos Bipartidos. A imagem abaixo mostra um exemplo de grafo bipartido:

Para determinar se um grafo é bipartido, vamos colorir os seus vértices com cores $$0$$ ou $$1$$, de forma que cada aresta ligue apenas vértices de cores diferentes. O grafo será bipartido se, e somente se, é possível realizar tal coloração.

Para colorir o grafo, usaremos o seguinte algoritmo, utilizando uma BFS:

  1. Inicie uma BFS para cada componente conexa do grafo, em um vértice arbitrário de tal componente, e suponha, sem perda de generalidade, que a cor deste vértice é $$0$$.
  2. Durante a BFS, sendo $$u$$ o vértice atual no topo da fila, colora cada vizinho $$v$$ de $$u$$ com a cor contrária à cor de $$u$$.
  3. Após realizada a BFS em cada componente, o grafo será bipartido se, e somente se, cada aresta do grafo conecta vértices de cores opostas.

Como realizamos apenas uma BFS por componente conexa do grafo, a complexidade final do algoritmo é $$O(N+M)$$.

Confira o código abaixo para melhor entendimento: