Betrachten wir einen Graphen , möchten wir wissen, ob es zwei verschiedene Pfade von A nach B mit der gleichen Länge gibt. Was ist zu tun? Einfach: Code zwei Pfade in einem. Definieren Sie den Graphen G ' mit den Eckpunkten V × V × { 0 , 1 } . Sie machen einen Schritt in G ', indem Sie zwei unabhängige Schritte in G machen . Das zusätzliche Bit zeigt an, ob die beiden Pfade bereits voneinander getrennt wurden.GABG′V×V×{0,1}G′G
Formal gibt es eine Kante in G ', wenn i → i ' , j → j ' in G und e ' = e ∨ ( i , i ') ) ≠ ( j , j ′ ) .(i,j,e)→(i′,j′,e′)G′i→i′j→j′Ge′=e∨(i,i′)≠(j,j′)
Der Algorithmus prüft, ob ein Pfad vorhanden ist in G ' ( A , A , 0 ) zu ( B , B , 1 ) gibt , der O ( V 4 ) oder so etwas wie O ( ( V + E ) 2 ) ist .(A,A,0)(B,B,1)G′O(V4)O((V+E)2)
Wenn Sie zustimmen, dass dieser Algorithmus korrekt ist, ist der Pfad in folglich höchstens 2 n 2 lang , daher müssen mögliche "Pfadkollisionen" spätestens bei dieser Länge auftreten. Aus dieser Beobachtung können Sie einen O ( V ω log V ) -Algorithmus erhalten, wobei ω die Komplexität der Matrixmultiplikation ist (fragen Sie, ob Sie einen Spoiler benötigen ...).G′2n2O(VωlogV)ω
Ich bin der festen Überzeugung, dass es einen -Algorithmus gibt, der mehr von der Struktur des Problems Gebrauch macht.O(V+E)