Całkiem podobne do mojego wcześniejszego pytania . Tym razem jednak wykres nie jest przekierowany.
Dany
- Nieukierunkowane wykres bez wielu krawędzie lub pętli
- Źródło wierzchołek ,
- Docelowy wierzchołek ,
- Maksymalna długość ścieżki ,
Szukam - podgraf który zawiera dowolny wierzchołek i dowolną krawędź w (i tylko te), które są częścią co najmniej jednej prostej ścieżki od do o długości .
Uwagi:
- Nie muszę wyliczać ścieżek.
- Szukam wydajnego algorytmu (zarówno czasu, jak i pamięci), ponieważ muszę go wykonać na bardzo dużych wykresach (10 ^ 8 wierzchołków, 10 ^ 9 krawędzi).
ds.algorithms
graph-algorithms
shortest-path
Lior Kogan
źródło
źródło
Odpowiedzi:
Cóż, problem jest w po wszystkim. Zachowam poprzednią odpowiedź, ponieważ działa ona również w przypadku skierowanym (którym jest NPC, jak odpowiedziano na drugie pytanie) i pokazuje, że F P T w odniesieniu do l .P. faP.T. l
W przypadku nieukierunkowanym jest on rozwiązywalny, deterministycznie poprzez minimalny przepływ kosztów (może to nie działać na skalach, o których mowa w pytaniu, ale jest lepszy niż algorytm wykładniczy.
Poniższa procedura zadecyduje, czy część zbocza powinna być częścią wykresu wyjściowego. Aby rozwiązać pierwotny problem, po prostu zapętl wszystkie krawędzie.e = ( u , v ) ∈ E.
Aby utworzyć sieć przepływu, wykonaj następujące czynności:
Krok 1: Rozwiń aby mieć wierzchołek x e i zamień e na krawędzie ( u , x e ) , ( x e , u ) , ( v , x e ) , ( x e , v ) (są one skierowane jako część sieci przepływowej), ustaw ich koszt na 0.mi xmi mi ( u , xmi) , ( xmi, u ) , ( v , xmi) , ( xmi, v )
Krok 2: zamień każdy wierzchołek , z wyjątkiem x e, na dwa wierzchołki t - i t + , i dodaj krawędź ( t - , t + ) . Ustaw koszt tych krawędzi na 1.t xmi t- t+ ( t-, t+)
Krok 3: Zastąp każdą krawędź krawędziami ( a + , b - ) , ( b + , a - ) . Ustaw koszt tych krawędzi na 0.{ a , b } ∈ E ( a+, b-) , ( ur+, a-)
Krok 4: Dodaj nowy wierzchołek i dodaj krawędzie ( s , y e ) , ( t , y e ) z kosztem 0.ymi ( s , ymi) , ( t , ymi)
Krok 5: ustaw wszystkie pojemności na 1.
Teraz uruchom algorytm przepływu kosztu minimalnego, szukając przepływu o wartości 2 od do y e .xmi ymi
Analiza:
źródło
Oto zła odpowiedź: generuje niektóre wierzchołki, które są częścią nieprostych ścieżek od do i które nie są częścią żadnej prostej ścieżki od do długości . Odpowiedź może nadal dotyczyć wniosku osoby pytającej, więc zostawiam ją tutaj.t s t ≤ ℓs t s t ≤ ℓ
Oto algorytm działający w czasie (i faktycznie jest szybszy niż ten, gdy jest mały).ℓO ( | V| + | mi| ) ℓ
Algorytm uruchamia wyszukiwanie BFS od które kończy się na głębokości . Ten BFS daje zestaw wszystkich wierzchołków osiągalnych z ze ścieżką o długości co najwyżej , a także oblicza odległości dla każdego . Następnie zrobiłbym to samo i zestaw i odległości od . Wreszcie wierzchołki, których szukasz, to dokładnie . Krawędzie są dokładnie tymi krawędziami w E [ V s o l uℓ V s s ℓ d i s t ( s , v ) v ∈ V s t V t t V s o l u t i o n = { v : v ∈ V s ∩ V t , d i s t ( s , v ) + d i s t ( t ,s ℓ V.s s ℓ rei s t ( s , v ) v ∈ Vs t V.t t V.s o l u t i o n= { v : v ∈ Vs∩ V.t, di s t ( s , v ) + dist(t,v)≤ℓ} (=(v,u)∈E:u,v∈ V s o l u t i o n ).E[Vsolution] =(v,u)∈E:u,v∈Vsolution
Czas działania tego algorytmu jest z pewnością ponieważ robi on tylko dwa BFS. Ale czas działania jest w rzeczywistości który będzie znacznie mniejszy niż rozmiar wykresu, gdy promieniowe sąsiedztwa i są małe.O(|V|+|E|) ℓ s tO(|Vs|+|Vt|+|E[Vs]|+|E[Vt]|) ℓ s t
Edycja: prawdopodobnie w praktyce jest nieco szybszy algorytm, który wykonuje BFS z głębokości i t tylko ℓ / 2 zamiast ℓ . To odkrywa wszystkie ścieżki, a następnie przy odrobinie księgowości można znaleźć wszystkie wierzchołki. Skraca to czas działania o pierwiastek kwadratowy w przypadku dużego losowo wyglądającego wykresu, gdy ℓ jest małe.s t ℓ/2 ℓ ℓ
źródło
Jest to zamierzone jako komentarz, ale jest zbyt długi, aby opublikować komentarz.
Możesz również być zainteresowany kluczami graficznymi lub emulatorami do swoich celów. Klucz grafu jest subgraph H = ( V , E ' ) z kilkoma krawędzi, ale w przybliżeniu zachowana odległości. Emulator to wykres którego krawędzie mogą być ważone.G=(V,E) H=(V,E′) H=(V,E′,w)
Najlepszy wynik dla kluczy to krawędzi i błąd addytywny +6 w szacunkach odległości na wykresie. Najlepszy wynik dla emulatorów to krawędzie i błąd addytywny +4. Nie wiadomo też, czy możemy pokonać , nawet jeśli błąd może być polilogarytmiczny.O ( n 4 / 3 ) O ( n 4 / 3 )O(n4/3) O(n4/3) O(n4/3)
Jeśli to wydaje się przydatne, mogę spróbować wykopać odpowiednie konstrukcje dla ciebie.
źródło