Podgraf zawierający wszystkie węzły i krawędzie, które są częścią prostych ścieżek st o ograniczonej długości na niekierowanym wykresie


12

Całkiem podobne do mojego wcześniejszego pytania . Tym razem jednak wykres nie jest przekierowany.

Dany

  • Nieukierunkowane wykres G bez wielu krawędzie lub pętli
  • Źródło wierzchołek s ,
  • Docelowy wierzchołek t ,
  • Maksymalna długość ścieżki l ,

Szukam G - podgraf G który zawiera dowolny wierzchołek i dowolną krawędź w G (i tylko te), które są częścią co najmniej jednej prostej ścieżki od s do t o długości l .

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).

Sprawdź to. Znaleziono ten artykuł, który wydaje się robić podobną redukcję przepływu kosztów minimalnych, ale wykorzystuje specjalne cechy sieci, aby rozwiązać go szybciej niż ogólne algorytmy MCF.
RB

Odpowiedzi:


6

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 .PFPTl

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.exee(u,xe),(xe,u),(v,xe),(xe,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.txett+(t-,t+)

Krok 3: Zastąp każdą krawędź krawędziami ( a + , b - ) , ( b + , a - ) . Ustaw koszt tych krawędzi na 0.{za,b}mi(za+,b-),(b+,za-)

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 .xmiymi


Analiza:

  • xmiymix et y exmisymixmitymi
  • Ścieżki są rozłączne, ponieważ dla każdego wierzchołka jest tylko 1 pojemność w łuku .( t - , t + )t(t-,t+)
  • Zwrócone ścieżki to dwie ścieżki, których suma odległości jest minimalna, a to także koszt znalezionego przepływu. To pozwala nam dodać do wykresu wyjściowego lub usunąć w inny sposób.mi

1
Łatwiej jest zrozumieć argument w powyższej odpowiedzi, usuwając redukcję do ukierunkowanego przepływu. Istnieje prosta ścieżka od do zawierająca węzeł iff, istnieje ścieżka od do oraz ścieżka od do tak że i są węzłami rozłącznymi, z wyjątkiem . To zasadniczo wykorzystuje bezkierunkowość. Można to sprawdzić za pomocą przepływu, a wersję kosztową można również wykonać za pomocą przepływu minimalnego kosztu. Można sprawdzić, czy istnieje prosta ścieżka od do zawierającat v P v s Q v t P Q v s t e estvP.vsQvtP.Qvstmiwprowadzając węzeł w środku . mi
Chandra Chekuri

@ChandraChekuri - to prawda, ale pamiętaj, że jeśli problem nie ma ograniczenia długości, istnieje znacznie prostszy algorytm do podjęcia decyzji - patrz tutaj
RB

Jasne, wiem też o tym rozwiązaniu - koncepcyjnie dobrze jest rozumieć komponenty połączone ze sobą za pomocą rozłącznych ścieżek, chociaż można znaleźć wycięte wierzchołki i połączone komponenty bezpośrednio przez DFS.
Chandra Chekuri

@RB: Dziękuję. Sugerowany algorytm może być skuteczny, gdy l jest względnie duże, ale prawdopodobnie jest nieoptymalne dla względnie małych wartości l. Chyba mogę najpierw przyciąć G, usuwając wierzchołek dalej niż podłoga (l / 2) zs i sufit (l / 2) zt.
Lior Kogan

1
Spróbuj dostosować kolejny algorytm najkrótszej ścieżki (zwany również algorytmem Surballe'a w przypadku 2 ścieżek, które są tu interesujące). Chcesz znaleźć najkrótsze 2 ścieżki od (lepiej nazwać to zamiast ponieważ jest takie samo dla wszystkich krawędzi) do każdego . Myślę, że można to zrobić skutecznie, najpierw obliczając drzewo najkrótszej ścieżki od a następnie ostrożnie wdrażając obliczenia drugiej ścieżki. y y e x e yyyymixey
Chandra Chekuri

1

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 stst

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 uV 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 sV t , d i s t ( s , v ) + d i s t ( t ,sV.ssrejast(s,v)vV.stV.ttV.solutjaon={v:vV.sV.t,rejast(s,v)+rejast(t,v)}(=(v,u)E:u,v V s o l u t i o n ).mi[V.solutjaon]=(v,u)mi:u,vV.solutjaon

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.|+|mi|)s tO(|V.s|+|V.t|+|mi[V.s]|+|mi[V.t]|)st

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.st/2)


3
To nie zmusza ścieżki do bycia prostym. Rozważ prosty wykres ścieżki i l = 4 . Zwrócisz jako część wyniku, chociaż nie ma prostej ścieżki st, która przechodzi przez ...t-u-s-v-xl=4vvv
RB

Dzięki za korektę @RB. Zredagowałem swoją odpowiedź, aby zauważyć, że jest zła.
pierożek Mobius

1

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.sol=(V.,mi)H.=(V.,mi)H.=(V.,mi,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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.