Informatyczny kącik olimpijski
Podział grafu
Jednym z najtrudniejszych zadań, z którym mierzyli się uczestnicy światowych finałów konkursu ACM ICPC w roku 2014, było zadanie pt. Metal Processing Plant.
Zadanie. Dany jest -wierzchołkowy nieskierowany graf pełny. Dla każdej krawędzi grafu znamy jej wagę Wagą podzbioru wierzchołków nazwiemy maksymalną wagę krawędzi po wszystkich parach wierzchołków z tego podzbioru, tzn.
Należy znaleźć podział wierzchołków grafu na dwa podzbiory których sumaryczna waga jest jak najmniejsza.
Załóżmy na początek, że zdecydowaliśmy, iż podzielimy graf na dwa podzbiory o wagach nie większych niż ustalone liczby i i chcemy stwierdzić, czy da się to zrobić. Innymi słowy, chcemy znaleźć dwa podzbiory i że i Dla każdego wierzchołka wprowadźmy zmienną logiczną która oznaczać będzie, czy wierzchołek należy do podzbioru Skonstruujemy teraz listę zdań logicznych, które zakodują ograniczenia na wartości zmiennych.
Każda z krawędzi łączy dwa wierzchołki z podzbioru (wtedy ), dwa wierzchołki z podzbioru (wtedy ) lub wierzchołki należące do różnych podzbiorów (i wtedy nie mamy ograniczenia na wagę tej krawędzi). Załóżmy bez straty ogólności, że
- (1)
- Jeśli to wierzchołki mogą znajdować się gdziekolwiek.
- (2)
- Jeśli to co najmniej jeden z wierzchołków musi znajdować się w podzbiorze czyli musi być spełniona alternatywa
- (3)
- Jeśli to wierzchołki muszą znajdować się w różnych podzbiorach, czyli muszą być spełnione obie alternatywy oraz
Każda z alternatyw zawiera dwie zmienne (lub ich negacje), zatem do znalezienia takich wartości zmiennych, które spełniają wszystkie alternatywy, możemy użyć algorytmu 2-SAT. Algorytm ten działa w czasie liniowym od liczby zmiennych i alternatyw, w naszym przypadku będzie to zatem czas
Jesteśmy już gotowi zaproponować pierwsze rozwiązanie naszego zadania. Ponieważ waga podzbioru jest równa wadze jednej z krawędzi grafu, więc mamy możliwości wyboru każdej z liczb i Sprawdzenie dla wszystkich tych wyborów, czy istnieje podział, i wybranie podziału dla najmniejszej sumy daje rozwiązanie działające w czasie Jednak wybory te nie są zupełnie niezależne. Zauważmy, że jeśli dla pewnej pary podział istnieje, to istnieje też dla pary o większych wartościach. Zatem dla ustalonej wartości którą wybierzemy na sposobów, możemy znaleźć najmniejszą wartość używając wyszukiwania binarnego w czasie To da nam rozwiązanie działające w czasie
Okazuje się, że możemy istotnie zmniejszyć liczbę kandydatów na wartość Powiemy, że krawędź jest wewnętrzna, jeśli oba wierzchołki znajdują się w tym samym podzbiorze. Załóżmy, że znaleźliśmy maksymalne drzewo rozpinające grafu. Każda krawędź nienależąca do tego drzewa wyznacza cykl (w którym pozostałe krawędzie należą do drzewa). Jeśli cykl ten ma nieparzystą długość, to co najmniej jedna z jego krawędzi musi być wewnętrzna. Z kolei jeśli cykl ten ma parzystą długość i zawiera jakąś krawędź wewnętrzną, to musi zawierać co najmniej dwie takie krawędzie (a więc co najmniej jedną krawędź drzewową).
Załóżmy, że nie jest równe wadze żadnej krawędzi z maksymalnego drzewa rozpinającego, w szczególności krawędź wewnętrzna nie należy do drzewa. Jeśli ta krawędź wyznacza cykl długości parzystej, to na tym cyklu znajduje się jeszcze jedna krawędź wewnętrzna Ale wtedy co daje sprzeczność. Zatem krawędź wyznacza cykl długości nieparzystej. Rozważmy krawędź niedrzewową wyznaczającą nieparzysty cykl, taką że waga jest maksymalna; zatem Ponieważ jest minimalną wagą na tym cyklu i cykl ten zawiera krawędź wewnętrzną, to Tak więc w tym przypadku
Z tego wynika, że mamy kandydatów na wartość Są to wagi wszystkich krawędzi należących do drzewa oraz maksimum z wag krawędzi niedrzewowych tworzących cykle o nieparzystej długości. Drzewo rozpinające można znaleźć algorytmem Kruskala w czasie Jeśli wykonamy dwukolorowanie tego drzewa w czasie to będziemy mogli dla każdej niedrzewowej krawędzi odpowiadać w czasie stałym, czy tworzy ona cykl nieparzystej długości.
Ostatecznie dostajemy algorytm działający w czasie