Escrito por Arthur Lobo
Conhecimento prévio necessário:
O problema nos pede algo bem simples: o tamanho do menor ciclo presente no grafo; mas na hora de construirmos uma solução podemos acabar indo pelo caminho errado, já que ele possui várias ideias que parecem certas mas na verdade tem algum erro. Na solução correta, primeiro vamos resolver um problema mais simples: dado uma aresta que está no grafo, qual o menor ciclo que passa por essa aresta?
O ciclo vai ser constituído por 2 formas (caminhos) de ir de até
que não compartilham nenhuma aresta. Um deles é feito somente pela aresta
; o outro é um caminho de
até
que não usa a aresta
(já que ela foi usada no primeiro caminho).
Portanto, o tamanho desse ciclo é a quantidade de arestas no "caminho 1" (que é 1) + a quantidade de arestas no "caminho 2". Queremos que o "caminho 2" tenha o menor número de arestas, então já que ele não pode ter a aresta . basta removermos essa aresta e utilizar uma
para saber o menor caminho de
até
sem a aresta
.
Então podemos, para cada aresta presente no grafo, saber qual é o menor ciclo que contém ela removendo a aresta
e calculando a menor distância de
até
sem a aresta, e o tamanho desse ciclo será 1 +
. A complexidade é
para cada aresta, então no total fica
.
Para entender o porquê de essa solução sempre computa o menor ciclo, é só ver que para qualquer aresta que está presente no menor ciclo, a resposta ao calcular o menor ciclo que passa por essa aresta é exatamente o tamanho do menor ciclo.
Recomendamos que você tente implementar o problema antes de ver o código. Veja a implementação nesse link.