Informatyczny kącik olimpijski
Dziurawa szachownica
W tym miesiącu omówimy zadanie, które pojawiło się w pierwszej edycji konkursu Potyczki Algorytmiczne, w roku 2005.
Zadanie. Dana jest szachownica o wierszach i kolumnach , mająca taki feler, że na niektórych jej polach znajdują się dziury. Obliczono, na ile sposobów można na tej szachownicy rozstawić wież tak, by żadna z wież nie stała na dziurawym polu i nie groziła zbiciem innej (tzn. w każdej kolumnie może stać co najwyżej jedna wieża, a w każdym wierszu stoi dokładnie jedna wieża). Należy wskazać te pola szachownicy, w których można wywiercić dodatkowe dziury tak, aby powyższa liczba ustawień nie zmieniła się. Przykładowa szachownica została przedstawiona na poniższym rysunku. Krzyżykami oznaczono dziurawe pola, zaś kolorem wyróżniono jedno z dwóch prawidłowych rozmieszczeń wież. Dodatkowe dziury można zrobić na polach b1 oraz a2.
Zapewne niektórzy Czytelnicy od razu zorientują się, że pod płaszczykiem terminologii szachowej kryje się problem, który możemy sprowadzić do znajdowania skojarzeń w grafach dwudzielnych. Tak jest istotnie. Rozważmy bowiem graf dwudzielny o wierzchołkach: wierzchołki ze zbioru będą odpowiadać wierszom szachownicy, natomiast wierzchołki ze zbioru – kolumnom. Dwa wierzchołki i łączymy krawędzią wtedy, gdy na przecięciu wiersza i kolumny nie ma dziury. W takiej sytuacji poprawne rozstawienie wież na szachownicy odpowiada skojarzeniu rozmiaru w grafie Treść zadania możemy więc przeformułować następująco: należy znaleźć te krawędzie w grafie które nie należą do żadnego skojarzenia rozmiaru
To prowadzi nas do pierwszego rozwiązania. Dla każdego niedziurawego pola szachownicy wykonujemy następujące sprawdzenie: stawiamy na nim wieżę i próbujemy rozstawić wież na pozostałej części szachownicy, uruchamiając algorytm wyznaczania najliczniejszego skojarzenia w grafie dwudzielnym. Rozwiązanie to można przyspieszyć: zamiast za każdym razem od nowa znajdować najliczniejsze skojarzenie, możemy zacząć od poprzednio znalezionego. W tym celu usuwamy wieże z wiersza i kolumny Za każdym razem wystarczy zatem ustawić co najwyżej dwie brakujące wieże, czyli znaleźć co najwyżej dwie ścieżki powiększające skojarzenie. Złożoność czasowa to
Podamy teraz lepsze rozwiązanie. Na początek znajdujemy w grafie dowolne skojarzenie rozmiaru (jeśli takie skojarzenie nie istnieje, to można wywiercić dziury we wszystkich polach). Tworzymy teraz graf skierowany o takim samym zbiorze wierzchołków co i następujących krawędziach:
- (1)
- krawędzie, które w grafie należały do znalezionego skojarzenia, kierujemy od do
- (2)
- pozostałe krawędzie z kierujemy od do
- (3)
- dodajemy krawędzie z wszystkich skojarzonych wierzchołków w do wszystkich nieskojarzonych wierzchołków w
Następnie znajdujemy silnie spójne składowe w grafie Okazuje się, że krawędzie, które nie należą do żadnego skojarzenia rozmiaru w grafie to te krawędzie typu (2) w grafie które łączą dwie różne silnie spójne składowe. Spróbujmy to uzasadnić.
Stosunkowo łatwo wykazać, że pozostałe krawędzie typu (2) należą do pewnego skojarzenia. Rozważmy taką krawędź która leży wewnątrz pewnej silnie spójnej składowej, zatem leży ona na pewnym cyklu. Cykl ten może składać się z naprzemiennych krawędzi typu (1) i (2) lub może zawierać krawędzie typu (3). W pierwszym przypadku do skojarzenia zamiast krawędzi typu (1) z cyklu bierzemy krawędzie typu (2) i uzyskujemy nowe skojarzenie zawierające krawędź W drugim przypadku rozważamy najdłuższą ścieżkę cyklu zawierającą a niezawierającą krawędzi typu (3). Ścieżka ta składa się na zmianę z krawędzi typu (1) i (2) oraz zaczyna się w wierzchołku nieskojarzonym, a kończy w skojarzonym. Znowu więc odwrócenie rolami krawędzi typu (1) i (2) załatwia sprawę.
Rozważmy teraz krawędź (z do ) typu (2), która łączy w dwie różne silnie spójne składowe. Wszystkie wierzchołki w są skojarzone, niech więc będzie wierzchołkiem skojarzonym z Oznaczmy przez zbiór tych wierzchołków, z których można dojść do wierzchołka (w szczególności ). Wszystkie wierzchołki w są skojarzone, w przeciwnym przypadku taki nieskojarzony wierzchołek musiałby być w zatem prowadziłaby do niego krawędź typu (3) z czyli krawędź leżałaby wewnątrz silnie spójnej składowej. Ponadto zbiory i są równoliczne i skojarzone między sobą oraz żaden z wierzchołków nie jest połączony z wierzchołkami spoza Innymi słowy, wszystkie wierzchołki z są potrzebne do skojarzenia wierzchołków z zatem w najliczniejszym skojarzeniu żaden nie może być skojarzony przez krawędź To kończy dowód.
Na złożoność czasową rozwiązania składa się znalezienie najliczniejszego skojarzenia w i wyznaczenie silnie spójnych składowych w Pierwszy krok można wykonać w czasie korzystając z metody ścieżek naprzemiennych, lub w czasie korzystając z algorytmu Hopcrofta–Karpa.
Drugi krok można wykonać za pomocą dwóch przeszukań grafu w głąb. Jako ćwiczenie dla Czytelnika pozostawiamy pokazanie, że można to zrobić w czasie Kłopot stanowią krawędzie typu (3), których może być rzędu należy zatem wykorzystać ich regularną strukturę.