Рассмотрим граф , мы хотим знать, существуют ли два разных пути от A до B одинаковой длины. Что делать? Просто: закодируйте два пути в одном. Определим граф G ' с вершинами V × V × { 0 , 1 } . Вы делаете шаг в G ' , сделав два самостоятельных шагов в G . Дополнительный бит сообщает вам, не разделены ли два пути друг от друга.GABG′V×V×{0,1}G′G
Формально существует ребро в G ′ тогда и только тогда, когда i → i ′ , j → j ′ в G и e ′ = e ∨ ( i , i ′ ) ≠ ( j , j ′ ) .(i,j,e)→(i′,j′,e′)G′i→i′j→j′Ge′=e∨(i,i′)≠(j,j′)
Алгоритм проверяет, существует ли путь к ( B , B , 1 ) в G ' , который является O ( V 4 ) , или что-то вроде O ( ( V + E ) 2 ) .(A,A,0)(B,B,1)G′O(V4)O((V+E)2)
Если вы согласны с тем, что этот алгоритм корректен, то, как следствие, длина пути в не превышает 2 n 2 , поэтому потенциальные «коллизии пути» должны иметь место не позднее этой длины. Из этого наблюдения можно получить алгоритм O ( V ω log V ) , где ω - сложность умножения матриц (спросите, нужен ли вам спойлер ...).G′2n2O(VωlogV)ω
Я твердо чувствую, что есть алгоритм , который использует больше структуры проблемы.O(V+E)