Mówi się, że ukierunkowany wykres jest unipatyczny, jeśli dla dowolnych dwóch wierzchołków i na wykresie istnieje co najwyżej jedna prosta ścieżka od do .
Załóżmy, że otrzymałem wykres jednoczynnościowy taki, że każda krawędź ma dodatnią lub ujemną wagę, ale nie zawiera żadnych ujemnych cykli masy.
Z tego chcę znaleźć algorytm, który wyszukuje wszystkie najkrótszej ścieżki do wszystkich węzłów od węzła źródłowego .
Nie jestem pewien, jak bym podszedł do tego problemu. Próbuję zobaczyć, jak mógłbym wykorzystać fakt, że nie zawiera on żadnych ujemnych cykli wagi i oczywiście co najwyżej jedną prostą ścieżkę między dowolnym węzłem do .
algorithms
graphs
gprime
źródło
źródło
Odpowiedzi:
Wybierz reprezentację danych
Najpierw spójrz na rozmiar wyniku. Chcesz kolekcji najkrótszych ścieżek od do każdego innego węzła. O ile średnia długość ścieżki nie jest ograniczona stałą (co nie jest: żadna lista jest ścieżką unipath, a jeśli weźmiesz root jako całkowita długość ścieżek wynosi gdzie jest długość listy), musisz zachować ostrożność w reprezentacji danych: struktura zawierająca ścieżki będzie musiała korzystać z udostępniania między ścieżkami.s n ( n - 1 ) / 2 ns s n(n−1)/2 n
Proponuję zapisać wynik w tablicy indeksowanej według węzłów o numerach od do , przy czym . Każdy element w tablicy przechowuje indeks poprzedniego węzła na ścieżce do tego węzła (użyj np. jako specjalnego znacznika dla węzłów, które są nieosiągalne od ). Ścieżka od do będzie .| E | - 1 s = 0 - 1 s s t ( s = R [ … R [ t ] … ] , … , R [ R [ t ] ] , R [ t ] , t )0 |E|−1 s=0 −1 s s t (s=R[…R[t]…],…,R[R[t]],R[t],t)
Przejdź przez wykres
Zainicjuj dla wszystkich .- 1R −1
Wykonaj przemierzanie wykresu w pierwszej kolejności lub w pierwszej szerokości, zaczynając od . Za każdym razem, gdy osiągany jest węzeł , ustaw na jego poprzednika.u R [ u ]s u R[u]
Ponieważ istnieją cykle, węzeł może zostać osiągnięty więcej niż jeden raz. Mając wskazuje, że już zostały otwarte.uR[u]≠−1 u
Udowodnij poprawność
Udowodnij złożoność
Algorytm może dotrzeć do każdego węzła więcej niż raz, więc nie jest jasne, czy jego złożoność wynosi . praca to w rzeczywistości gdzie to krawędzie, które są dostępne ze źródła. Dokładniej, do węzła dochodzimy więcej niż raz tylko w jednej sytuacji: jeśli węzeł jest pierwszym, który osiągamy w danym cyklu, iw tym przypadku osiągamy go dwukrotnie (raz z prostej ścieżki i raz po ukończeniu cyklu ).Θ ( | E 0 | ) V 0O(|V|) Θ(|E0|) V0
No więc. Udowodnijmy, że na grafie unipatycznym liczba cykli elementarnych rośnie co najwyżej liniowo wraz z liczbą węzłów. (Cykl elementarny to taki, który nie zawiera krótszego cyklu.) W poniższej dyskusji założę, że wykres nie ma własnej krawędzi (żadnej krawędzi od węzła do siebie; takie krawędzie i tak nie mają znaczenia dla konstrukcji ścieżki ).
Wykresy unipatyczne mogą mieć cykle, ale w bardzo ograniczony sposób. Byłoby miło, gdybyśmy mogli jakoś powiązać każdy cykl z odrębnym węzłem (lub przynajmniej co najwyżej ograniczoną liczbą cykli na węzeł). Czy cykle mogą współdzielić węzeł? Niestety tak.
Więc będziemy musieli pracować ciężej. Spróbujmy to udowodnić indukcyjnie. Niech będzie liczbą węzłów na wykresie , liczbą krawędzi, a liczbą cykli elementarnych, które nie są krawędziami własnymi. Twierdzę, że jeśli jest jednoznaczny i nie jest pusty, to .#V(G) G #E(G) #C(G) G #C(G)≤#V(G)−1
Jest to oczywiste w przypadku wykresu z jednym lub dwoma węzłami. Załóżmy, że twierdzenie to dotyczy wszystkich grafów, tak że i niech będzie grafem unipatycznym z węzłami. Jeśli nie ma cyklu, , obudowa zamknięta. W przeciwnym razie niech będzie cyklem elementarnym.#V(G)<n G n G 0=#C(G)<#V(G) (a1,…,am)
To kończy dowód. Przejście następuje co najwyżej krawędzi.2|V|−2
źródło