Considera un grafico , vogliamo sapere se ci sono due diversi percorsi da A a B della stessa lunghezza. Cosa fare? Semplice: codifica due percorsi in uno. Definire il grafico G ′ con i vertici V × V × { 0 , 1 } . Fate un passo nella G ' , facendo due passi indipendenti G . Il bit aggiuntivo indica se i due percorsi sono già stati separati l'uno dall'altro.solUNBsol'V× V× { 0 , 1 }sol'sol
Formalmente, c'è un bordo in G ′ iff i → i ′ , j → j ′ in G ed e ′ = e ∨ ( i , i ′ ) ≠ ( j , j ′ ) .( i , j , e ) → ( i', j', e')sol'io → io'j→j′Ge′=e∨(i,i′)≠(j,j′)
L'algoritmo verifica se esiste un percorso a ( B , B , 1 ) in G ′ , che è O ( V 4 ) , o qualcosa di simile a O ( ( V + E ) 2 ) .(A,A,0)(B,B,1)G′O(V4)O((V+E)2)
Se si concorda che questo algoritmo è corretto, di conseguenza, il percorso in è della lunghezza al massimo di 2 n 2 , pertanto le potenziali "collisioni di percorso" devono verificarsi al più tardi a quella lunghezza. Puoi ottenere un algoritmo O ( V ω log V ) da questa osservazione, dove ω è la complessità della moltiplicazione della matrice (chiedi se hai bisogno di uno spoiler ...).sol'2 n2O ( VωlogV)ω
Sento fortemente che esiste un algoritmo , che utilizza maggiormente la struttura del problema.O ( V+ E)