Ktoś może zaproponować mi liniowy algorytmu czasu, który wprowadzany jest skierowany acykliczny wykres a dwa wierzchołki i i powraca liczbę prostych odcinków z na w .
Mam algorytm, w którym uruchomię DFS (Głębokie pierwsze wyszukiwanie), ale jeśli DFS znajdzie to nie zmieni koloru (z białego na szary) żadnego z węzłów, które znajdują się na ścieżce tak że jeśli jest to podścieżka jakiejkolwiek innej ścieżki, to również DFS ponownie przechodzi przez tę podścieżkę. Na przykład rozważ listę przyległości, w której musimy znaleźć liczbę ścieżek od do vs t s t G t s ⇝ t p v
.
Czy mój algorytm jest poprawny? jeśli nie, jakie modyfikacje są potrzebne, aby było poprawne, lub wszelkie inne podejścia będą bardzo mile widziane.
Uwaga : Rozważyłem tutaj algorytm DFS podany w książce „Wprowadzenie do algorytmów przez Cormena”, w którym koloruje on węzły zgodnie z jego statusem, więc jeśli węzeł nie jest odwiedzany, niezbadany i badany, wówczas kolor będzie biały, odpowiednio szary i czarny. Wszystkie pozostałe elementy są standardowe.
źródło
Odpowiedzi:
Twoja obecna implementacja obliczy prawidłową liczbę ścieżek w DAG. Jednak nie oznaczanie ścieżek zajmie wykładniczy czas. Na przykład na poniższej ilustracji każdy etap DAG zwiększa całkowitą liczbę ścieżek o wielokrotność 3. Ten wykładniczy wzrost można rozwiązać za pomocą programowania dynamicznego.
Obliczenie liczby ścieżek - w DAG jest określone przez powtarzalność,s t
Prosta modyfikacja DFS obliczy to jako
Nietrudno zauważyć, że każda krawędź jest oglądana tylko raz, stąd środowisko uruchomieniowe .O ( V+ E)
źródło
Trzeba tylko zauważyć, że liczba ścieżek od jednego węzła do węzła docelowego jest sumą liczby ścieżek od jego potomków do celu. Wiesz, że ten algorytm zawsze się zatrzyma, ponieważ twój wykres nie ma żadnych cykli.
Teraz, jeśli zapiszesz liczbę ścieżek z jednego węzła do celu podczas odwiedzania węzłów, złożoność czasu stanie się liniowa w liczbie wierzchołków, a pamięć liniowa w liczbie węzłów.
źródło
Liczbę ścieżek między dowolnymi dwoma wierzchołkami w DAG można znaleźć za pomocą reprezentacji macierzy przyległości.
Załóżmy, że A jest macierzą przylegania G. Biorąc moc Kth z A po dodaniu do niej macierzy tożsamości, daje liczbę ścieżek o długości <= K.
Ponieważ maksymalna długość dowolnej prostej ścieżki w DAG wynosi | V | -1, obliczenie | V | -1 potęgi dałoby liczbę ścieżek między wszystkimi parami wierzchołków.
Obliczenia | V | -1 mocy można dokonać wykonując logarytmiczne (| V | -1) wielokrotności każdego z TC: | V | ^ 2.
źródło