Considere um gráfico , queremos saber se existem dois caminhos diferentes de a do mesmo comprimento. O que fazer? Simples: codifique dois caminhos em um. Defina o gráfico com os vértices . Você faz um passo em , fazendo duas etapas independentes no . O bit adicional informa se os dois caminhos já se separaram.A B G ′ V × V × { 0 , 1 } G ′ GGABG′V×V×{0,1}G′G
Formalmente, existe uma aresta em se se , em e .L ' i → i ' j → j ' L e ' = e ∨ ( i , i ' ) ≠ ( J , J ' )(i,j,e)→(i′,j′,e′)G′i→i′j→j′Ge′=e∨(i,i′)≠(j,j′)
O algoritmo verifica se existe um caminho para em , que é( B , B , 1 ) G ′ O ( V 4 ) , ou algo como O ( ( V + E ) 2 ) .(A,A,0)(B,B,1)G′O(V4)O((V+E)2)
Se você concordar que esse algoritmo está correto, como conseqüência, o caminho em tem um comprimento máximo de 2 n 2 , portanto, possíveis "colisões de caminho" devem ocorrer o mais tardar nesse comprimento. Você pode obter um algoritmo O ( V ω log V ) a partir desta observação, onde ω é a complexidade da multiplicação da matriz (pergunte se você precisa de um spoiler ...).G′2n2O(VωlogV)ω
Sinto fortemente que existe um algoritmo , que utiliza mais a estrutura do problema.O(V+E)