Wykres ma dwa / trzy różne minimalne drzewa rozpinające?


15

Próbuję znaleźć skuteczną metodę wykrywania, czy dany wykres G ma dwa różne minimalne drzewa rozpinające. Próbuję również znaleźć metodę, aby sprawdzić, czy ma 3 różne minimalne drzewa rozpinające. Naiwnym rozwiązaniem, o którym myślałem, jest jednorazowe uruchomienie algorytmu Kruskala i znalezienie całkowitej masy minimalnego drzewa opinającego. Później, usuwając krawędź z wykresu i ponownie uruchamiając algorytm Kruskala i sprawdzając, czy ciężar nowego drzewa jest ciężarem oryginalnego minimalnego drzewa opinającego, a więc dla każdej krawędzi na wykresie. Środowisko wykonawcze to O (| V || E | log | V |), co wcale nie jest dobre, i myślę, że jest lepszy sposób, aby to zrobić.

Wszelkie sugestie byłyby pomocne, z góry dzięki


Byłoby miło być wyczekiwanym na taki algorytm, ale nie rozwiąże on obecnego problemu
itamar

2
Wykres będzie miał unikalne minimalne drzewo opinające wtedy i tylko wtedy, gdy (1) dla dowolnego podziału V ( G ) na dwa podzbiory, minimalna krawędź wagi z jednym punktem końcowym w każdym podzbiorze jest unikalna i (2) maksymalna waga krawędź w dowolnym cyklu G jest wyjątkowa. solV.(sol)sol
Juho

Czy te pytania pierwsze i drugie już odpowiadają na twoje pytanie?
Juho

Zobacz problem 23-1 w CLRS, aby znaleźć drugi najlepszy MST w . O(n2))
Kaveh

Odpowiedzi:


7

Kapoor i Ramesh ( odpowiednia wersja SIAM J. Comput. , Darmowa (?) Osobista wersja strony internetowej ) dają algorytm do wyliczania wszystkich drzew minimalnych obejmujących zarówno wykresy ważone, jak i nieważone.

Rozumiem podstawową ideę, że zaczynasz od jednego MST, a następnie zamieniasz krawędzie leżące wzdłuż cykli na wykresie (tak długo, jak ciężary są w porządku, zamieniasz jedną krawędź na drugą, o której wiesz, że ponownie połączy drzewo) .

W przypadku ważonym dają czas pracy do wyszczególnienia wszystkich minimalnych drzew opinających gdzie N jest liczbą takich drzew opinających. Wylicza je w kolejności rosnącej wagi, a moje obecne (pobieżne) rozumienie sugeruje, że całkowicie wykonalne jest zakończenie algorytmu po wygenerowaniu określonej liczby drzew (ponieważ zaczyna się od MST i tworzy je sekwencyjnie).O(N.|V.|)N.


W tej sytuacji chcielibyśmy wcześniej przerwać działanie algorytmu, gdy wiemy, że istnieje więcej niż rozwiązań. Czy algorytm na to pozwala? k
Raphael

1
@ Rafael, nie miałem czasu naprawdę się z tym uporać (tak, oznaczenie przydziału), ale z mojego szorstkiego zrozumienia powinno być to możliwe - zaczyna się od jakiegoś MST, a następnie generuje kolejne.
Luke Mathieson

1
@SaeedAmiri: „Liczba takich drzew opinających ” oznacza „liczbę drzew minimalnych ”, a nie „liczbę drzew opinających”. Jeśli wszystkie drzew rozpinających są drzewami minimalnymi, wówczas wykres wejściowy jest kompletny, a wszystkie krawędzie mają jednakową wagę. nn-2)
JeffE

1
O(|V.|)

1
Po szybkim odczycie algorytm ważony generuje drzewa w kolejności rosnącej masy (oczywiście zaczynając od MST). Tak powinno być dla celów PO.
Luke Mathieson

2

Można pokazać, że algorytm Kruskala może znaleźć każde minimalne drzewo rozpinające; patrz tutaj .

kk


5
kkK.1,5

@vonbrand Dobry punkt. Oczywiście możemy kontynuować, aby zakończyć wszystkie gałęzie obliczeń, ale wtedy środowisko wykonawcze zależy od liczby drzew opinających, które mogą być wykładnicze.
Raphael

1

Aby sprawdzić, czy istnieje więcej niż jeden MST, rozważ np. Algorytm Kruskala. Jedynym sposobem, w jaki mógłby konstruować różne MST, jest pominięcie krawędzi i wybranie innego, gdy jest ich kilka o tej samej wadze. Ale te krawędzie o tej samej masie mogły zostać wykluczone, ponieważ tworzyły cykl z jaśniejszymi krawędziami ...

Powinieneś więc uruchomić algorytm Kruskala, a jeśli jest kilka krawędzi o tej samej wadze do rozważenia, dodaj wszystkie, które można dodać bez tworzenia cykli. Jeśli pozostała krawędź tego ciężaru i nie zamyka ona cyklu z żadną krawędzią o niższych obciążnikach (które były wcześniej dodawane), istnieje więcej niż jeden MST. Sprawdzenie, czy są dokładnie 2, 3 lub więcej itd., Wygląda na znacznie trudniejsze ...


0

Algorytm Modidying Kruskala: Przy zamawianiu krawędzi klastuj krawędzie o równej wadze. Teraz, w miejscu, w którym przetwarzasz krawędzie w kolejności, za każdym razem, gdy dotrzesz do nowego klastra, najpierw sprawdź wszystkie krawędzie osobno i usuń z klastra te, które zamknęłyby cykl, biorąc pod uwagę to, co zostało zbudowane przed klastrem. Następnie uruchom wszystkie pozostałe krawędzie w klastrze, próbując teraz dodać je do MST. Jeśli którykolwiek z nich zamyka cykl, to koniecznie było to spowodowane wstawieniem wcześniej innych krawędzi tego samego klastra, co oznacza, że ​​masz więcej niż jeden MST.

To rozwiązanie zachowuje złożoność algorytmu Kruskala, tyle że zwiększa czas przetwarzania każdej krawędzi.


Wydaje się, że twierdzisz, że możesz przetwarzać cały klaster w stałym czasie, ale nie widzę żadnej oczywistej stałej związanej z rozmiarem klastra. Czy możesz podać więcej szczegółów na temat tego etapu?
David Richerby,
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.