Jaki jest najszybszy algorytm znajdowania wszystkich najkrótszych ścieżek na rzadkim wykresie?

24

Na nieważonym wykresie bezkierunkowym z wierzchołkami i krawędziami E, takimi jak 2 V > E , jaki jest najszybszy sposób znalezienia wszystkich najkrótszych ścieżek na wykresie? Czy można to zrobić szybciej niż Floyd-Warshall, który jest O ( V 3 ), ale bardzo szybki na iterację?VE2V>EO(V3)

Co powiesz na ważenie wykresu?

Jakob Weisblat
źródło

Odpowiedzi:

32

Ponieważ jest to wykres nieważony, można uruchomić pierwsze wyszukiwanie szerokości (BFS) z każdego wierzchołka na wykresie. Każde uruchomienie BFS daje najkrótsze odległości (i ścieżki) od wierzchołka początkowego do każdego innego wierzchołka. Złożoność czasowa dla jednego BFS wynosi O ( V + E ) = O ( V ), ponieważ E = O ( V ) na twoim rzadkim wykresie. Uruchamianie go V razy daje złożoność czasową O ( V 2 ) .vO(V.+mi)=O(V.)mi=O(V.)V.O(V.2))

W przypadku ważonego grafu kierunkowego algorytm Johnsona, sugerowany przez Yuvala, jest najszybszy dla grafów rzadkich. Wymaga które w twoim przypadku okazuje się być O ( V 2 log V ) . W przypadku ważonego niekierowanego wykresu można uruchomić algorytm DijkstryO(V.2)logV.+V.mi)O(V.2)logV.)z każdego węzła lub zamień każdą nieukierowaną krawędź na dwie przeciwnie skierowane krawędzie i uruchom algorytm Johnsona. Oba będą dawały takie same czasy aysmptotyczne jak powyższy algorytm Johnsona dla twojego rzadkiego przypadku. Zauważ też, że wspomniane powyżej podejście BFS działa zarówno dla grafów skierowanych, jak i niekierowanych.

Paresh
źródło
7

Istnieje algorytm Johnsona , którego czas działania wynosi .O(V.2)logV.+V.mi)

Yuval Filmus
źródło
7

Możesz spróbować stworzyć wersję Floyd-Warshall, która będzie szybsza na rzadkich matrycach.

Najpierw przypomnijmy sobie, co robi ten algorytm:

Niech będzie macierzą odległości. Na początku algorytmu M í , j jest waga krawędzi i j . Jeśli to krawędź nie istnieje wówczas M I , J = .M.M.ja,jotjajotM.ja,jot=

Algorytm ma kroków. W kroku k algorytmu dla każdej pary węzłów i , j ustawiamyV.kja,jot

M.ja,jotmin{M.ja,jot,M.ja,k+M.k,jot}.

M.ja,k=M.k,jot=remisoljan(k)remisolout(k)remisoljan(k)remisolout(k)kM.

k

mi=O(V.)k=0O(1)M.O(V.)k=|V.|O(V.2))O(V.3))

Amit Moscovich
źródło