Algorytm Borůvki
| Niniejszy artykuł jest częścią cyklu teoria grafów.
|
|
Najważniejsze pojęcia Wybrane klasy grafów Algorytmy grafowe Zagadnienia przedstawiane jako problemy grafowe Inne zagadnienia |
Algorytm Borůvki wyznacza minimalne drzewo rozpinające dla grafu nieskierowanego ważonego, o ile jest on spójny. Innymi słowy, znajduje drzewo zawierające wszystkie wierzchołki grafu, którego waga jest najmniejsza możliwa. Jest to przykład algorytmu zachłannego.
Pierwszy raz opublikowany został w 1926 roku przez Otakara Borůvkę jako metoda efektywnej konstrukcji sieci energetycznych. Algorytm ten został potem ponownie wymyślony przez Choqueta w 1938, potem przez Florka, Łukasiewicza, Perkala, Steinhausa i Zubrzyckiego w 1951 i ostatecznie przez Sollina w latach 60. Ponieważ Sollin był jedynym zachodnim informatykiem wśród wymienionych tu osób, często algorytm jest nazywany jego nazwiskiem.
Spis treści |
Algorytm [edytuj]
Algorytm działa poprawnie przy założeniu, że wszystkie krawędzie w grafie mają różne wagi. Jeśli tak nie jest, można np. przypisać każdej krawędzi unikatowy indeks i jeśli dojdzie do porównania dwóch krawędzi o takich samych wagach, wybrać tę, która otrzymała niższy numer.
- Dla każdego wierzchołka v w grafie G przejrzyj zbiór incydentnych z nim krawędzi. Dołóż najlżejszą z nich do rozwiązania (zbioru E').
- Po tym etapie graf tymczasowego rozwiązania powinien zawierać nie więcej niż
spójnych składowych. Utwórz graf G' w którym wierzchołki stanowiące spójne składowe zostaną ze sobą „sklejone” (nowe wierzchołki będziemy nazywać roboczo superwierzchołkami). - Dopóki nie otrzymamy jednej spójnej składowej, wywołujemy kroki 1-2 za graf G podstawiając graf G'
Po zakończeniu algorytmu G' jest minimalnym drzewem rozpinającym.
Dowód poprawności [edytuj]
Lemat 1 [edytuj]
W każdym momencie działania algorytmu, oraz po jego zakończeniu w E' nie będzie cyklu.
Dowód
Załóżmy nie wprost, że podczas działania algorytmu w którymś etapie pojawiła się spójna składowa, w której jest cykl. Oznaczmy ją jako S. Rozważmy następujące sytuacje:
- S powstała przez połączenie dwóch superwierzchołków v1 i v2. Oznacza to, że do zbioru E' zostały dołączone krawędzie ei i ej. Ponieważ ei została dołączona jako najlżejsza krawędź incydentna do v1 więc
. Ale skoro ej została dołączona jako najlżejsza krawędź incydentna do v2 to musi zachodzić
(Pamiętajmy, że w grafie nie ma krawędzi o takiej samej wadze) – sprzeczność. - S powstała przez połączenie się trzech lub więcej superwierzchołków. Podzielmy powstały cykl C na następujące części: niech
będą kolejnymi superwierzchołkami należącymi do C a
będą kolejnymi krawędziami należącymi do C, które zostały dodane w zakończonym właśnie etapie algorytmu. W C krawędzie
oraz superwierzchołki
występują na przemian. Z zasady działania algorytmu możemy stwierdzić, że aby powstał taki cykl, musi zachodzić
– Sprzeczność.
Lemat 2 [edytuj]
W każdym etapie działania algorytmu otrzymujemy dla każdego superwierzchołka minimalne drzewo rozpinające
Dowód
Gdy zostanie zakończony etap 1:
Załóżmy, że istnieje taki superwierzchołek
, który nie jest minimalnym drzewem rozpinającym poddrzewa złożonego z wierzchołków należących do
. Weźmy więc takie minimalne drzewo rozpinające T. Istnieje krawędź
taka, że
. Dodajmy
. W T powstał cykl. Ponieważ
jest incydenta do pewnego wierzchołka z tego cyklu, istnieje więc inna krawędź
incydentna do tego samego wierzchołka. Jednak z tego, że
wynika, że
. Jeśli usuniemy krawędź
z T otrzymamy mniejsze drzewo rozpinające, co jest sprzeczne z założeniem o minimalności T.
Gdy zostanie zakończony etap 2:
Z poprawności etapu 1 wiemy, że istnieje takie wywołanie etapu 2, w którym każdy z superwierzchołków jest minimalnym drzewem rozpinającym. Jest to choćby pierwsze wywołanie. Załóżmy zatem, że dla pewnego wywołania tego etapu otrzymano superwierzchołki będące minimalnymi drzewami rozpinającymi, jednak scaliło przynajmniej dwa z nich w taki sposób, że dało się otrzymać mniejsze drzewo rozpinające. Niech etap k-ty będzie pierwszym takim etapem, w którym coś się popsuło. Niech
będzie zbiorem krawędzi przed wywołaniem etapu k, a
będzie zbiorem krawędzi po jego wywołaniu. Niech T będzie minimalnym drzewem rozpinającym takim, że
, ale że
. Istnieje więc krawędź 
Fakt: Krawędź
dodana podczas k-tego wywołania. (Nie może należeć do
, gdyż inaczej superwierzchołek do którego by należała nie byłby minimalnym drzewem rozpinającym, co jest sprzeczne z dowodem dla pierwszego etapu i założeniem, że wywołanie k-te jest najmniejszym wywołaniem, które zwróciło nieoptymalne drzewa)
Dodajmy krawędź
do E(T). W T powstał cykl. Ponieważ
jest najmniejszą krawędzią incydentną do pewnego superwierzchołka z tego cyklu, istnieje więc inna krawędź incydenta do tego samego superwierzchołka. Jednak jej waga jest większa niż waga krawędzi
, zatem zastąpienie jej krawędzią
da nam mniejsze drzewo rozpinające co jest sprzeczne z założeniem o optymalności T.
Złożoność obliczeniowa [edytuj]
Łatwo udowodnić, że każdym kolejnym wywołaniu liczba wierzchołków zmaleje co najmniej dwukrotnie – zatem wywołań tych będzie co najwyżej
. Złożoność obliczeniowa całości zależy więc od sposobu implementacji kroków 1,2 algorytmu. Zastosowanie w implementacji struktury zbiorów rozłącznych pozwala osiągnąć złożoność na poziomie
. Można zmodyfikować go tak, aby osiągnąć złożoność
– algorytm działa wtedy znacznie szybciej dla grafów rzadkich; dla grafów gęstych modyfikacja nie daje dużych zysków czasowych.
spójnych składowych. Utwórz graf G' w którym wierzchołki stanowiące spójne składowe zostaną ze sobą „sklejone” (nowe wierzchołki będziemy nazywać roboczo superwierzchołkami).
. Ale skoro ej została dołączona jako najlżejsza krawędź incydentna do v2 to musi zachodzić
(Pamiętajmy, że w grafie nie ma krawędzi o takiej samej wadze) – sprzeczność.
będą kolejnymi superwierzchołkami należącymi do C a
będą kolejnymi krawędziami należącymi do C, które zostały dodane w zakończonym właśnie etapie algorytmu. W C krawędzie
występują na przemian. Z zasady działania algorytmu możemy stwierdzić, że aby powstał taki cykl, musi zachodzić
– Sprzeczność.