Considérons un graphe , nous voulons savoir s'il existe deux chemins différents de à de même longueur. Que faire? Simple: codez deux chemins en un. Définissez le graphe avec les sommets . Vous faites un pas dans en faisant deux étapes indépendantes dans . Le bit supplémentaire vous indique si les deux chemins se sont déjà séparés l'un de l'autre.A B G ′ V × V × { 0 , 1 } G ′ GgUNEBG′V×V×{0,1}G′G
Formellement, il y a une arête dans ssi , dans et .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′)
L'algorithme vérifie s'il existe un chemin vers dans , qui est , ou quelque chose comme .( B , B , 1 ) G ′ O ( V 4 ) O ( ( V + E ) 2 )(A,A,0)(B,B,1)G′O(V4)O((V+E)2)
Si vous convenez que cet algorithme est correct, par conséquent, le chemin dans est de longueur au plus , donc les "collisions de chemin" potentielles doivent se produire au plus tard à cette longueur. Vous pouvez obtenir un algorithme partir de cette observation, où est la complexité de multiplication de la matrice (demandez si vous avez besoin d'un spoiler ...). 2 n 2 O ( V ω log V ) ωG′2n2O(VωlogV)ω
Je pense fortement qu'il existe un algorithme , qui utilise davantage la structure du problème.O(V+E)