Oto (próba) algorytm wielomianowy czasu dla LKM arbitralne binarny DAG .G
To odpowiada na pytanie nr 3. (Przepraszam za niechlujny napis z góry. :))
Na początek wyrzuć „na zawsze” każdy wierzchołek nieosiągalny od . Nie dbamy o to, ponieważ nie są one częścią żadnej ścieżki - .s tsst
Następnie zdefiniuj podagony DAG i , początkowo puste. Następnie przez wszystkie wierzchołki ,B v ∈ G - { s , t }ABv∈G−{s,t}
Sprawdź, czy istnieje ścieżka od do . Jeśli tak, dodaj do . Jeśli nie, należy dodać do .t v A v BvtvAvB
Niech krawędzie i będą krawędziami indukowanymi przez wierzchołki w obrębie każdego zestawu (na razie zignoruj wszelkie krawędzie od do , od do oraz od do ; zauważ również, że nie ma żadnych krawędzi od do o budowa).B s A A t A B B tABsAAtABBt
Następnie obliczyć przechodni zamknięcie . Mianowicie, jesteśmy zainteresowani w znalezieniu jakiś zbiór wierzchołków , które są „listki” w sub-DAG .{ a ∗ } AA{a∗}A
Napraw dowolne takie . Zauważ, że musi być skierowana krawędź od do . Wynika to z faktu, że z założenia (i) istnieje ścieżka - przez , (ii) nie ma ścieżek od do , oraz (iii), ponieważ sam jest DAG i jest liściem , nie ma ścieżki od przez inny wierzchołek do .a ∗ t s t a ∗ a ∗ B A a ∗ A a ∗ A ta∗a∗tsta∗a∗BAa∗Aa∗At
Teraz musi istnieć skierowana krawędź od każdego wierzchołka w do jakiegoś wierzchołka w , lub niektóre z mają pojedynczą krawędź do . W obu przypadkach możemy usunąć dowolną krawędź .B { a ∗ } t a ∗ → t{a∗}B{a∗}ta∗→t
Jeśli= 1, albo musimy usunąć krawędź z unikalnego , lub istnieje wierzchołek wcześniej na ścieżce - zawierającej która ma dwie ścieżki do - jednej przez i jeden bezpośrednio. W przypadku, gdy ten ostatni może się utrzymać, rejestrujemy i postępujemy „zachłannie wstecz” (szczegóły na ten temat poniżej).|{a∗}|a∗→tsta∗ta∗a∗→t
Jeśli> 1, musimy albo usunąć wszystkie krawędzie z , albo istnieje pewna liczba krawędziwcześniej w przejściowym zamknięciu które odłączają wszystkie ścieżki od do do .|{a∗}|{a∗}→tk<|{a∗}|As{a∗}t
Tutaj wykorzystujemy fakt, że wykres jest binarnym DAG.G
Rozważ zestaw poprzedników . Ponieważ każdy z tych wierzchołków ma maksymalnie dwa stopnie, są dokładnie trzy przypadki:{a∗}
Przypadek 1. prekursor ma na zewnątrz krawędzią do pewnego wierzchołka w oraz na zewnątrz krawędzią do pewnego wierzchołka w .{a∗}B
W tym przypadku nie ma znaczenia, czy usuwamy krawędź z poprzednika do wierzchołka w czy krawędź od wierzchołka w do . Dlatego możemy „pominąć” ten wierzchołek (i sprawdzić, czy ścieżka wsteczna łączy się ze ścieżką innego wierzchołka w ).{a∗}{a∗}t{a∗}
Przypadek 2. Poprzednik ma krawędź wierzchołka w i inny poprzednik .{a∗}{a∗}
W takim przypadku musimy albo usunąć obie krawędzie z do , albo możemy usunąć pojedynczą wcześniejszą krawędź ścieżki od do poprzednika, który rozłącza obie ścieżki.{a∗}ts
Przypadek 3. Poprzednik ma krawędź do dwóch wierzchołków w .{a∗}
Jest to identyczne jak w przypadku 2. Nie ma znaczenia, czy usuwamy jedną z krawędzi tego poprzednika i odpowiadające im inne krawędzie z do , czy obie krawędzie z do . Chcemy tylko wiedzieć, czy możemy odłączyć ścieżkę od przez tego poprzednika do jedną krawędzią wcześniej na ścieżce od do poprzednika.{a∗}t{a∗}tsts
Podsumowując, gdy przeglądamy wstecz przez poprzedników w przejściowym zamknięciu , możemy zachłannie śledzić „najlepsze jak dotąd” wybory. Oznacza to, że na każdym etapie mamy oczywisty wybór, który polega na usunięciu pewnej liczby krawędzi, ale chcemy poczekać, aby zobaczyć, czy dostępna jest lepsza opcja. Po znalezieniu lepszej opcji możemy „zapomnieć” o poprzedniej opcji. Dlatego wystarczy chciwy wybór na każdej warstwie poprzedników (o ile czekamy do końca, aby dokonać wyboru).A
Dlatego przy niektórych podstawowych zapamiętywaniach czas i przestrzeń złożoności tego procesu wydają się wynosić najwyżej . Pomija to fakt, że chociaż możemy lokalnie / chciwie zidentyfikować, kiedy znaleźliśmy „tańszy wybór”, z góry nie jest jasne, które wcześniej zarejestrowane krawędzie należy usunąć. Dlatego rejestrujemy kolejność sprawdzania krawędzi podczas pracy. Po znalezieniu lepszej opcji powtarzamy wyszukiwanie do tego momentu, aby znaleźć wcześniej zarejestrowane krawędzie do usunięcia. Całkowity czas złożoności tego etapu wynosi a złożoność przestrzeni .O(|E|)O(|E|2)O(|E|)
W sumie złożoność czasu wynosi dla inicjalizacji plus dla zamknięcia przechodniego plus dla poszukiwanie. Całkowity czas wynosi .O(|V|⋅(|V|+|E|))O(|V|3)O(|E|2)O(|V|2+|E||V|+|V|3+|E|2)=O(|V|3+|E|2)
Po zakończeniu procesu otrzymujemy minimalny zestaw krawędzi wymagany do odłączenia od , zachowując co najmniej jeden brzeg każdego wierzchołka na wykresie (lub odkrywamy, że rozwiązanie jest niemożliwe po drodze i przerywamy).tst