Informatyczny kącik olimpijski
Fotoradary
W tym kąciku omówimy zadanie Fotoradary, które pojawiło się w 2013 roku na Akademickich Mistrzostwach Polski w Programowaniu Zespołowym.
Zadanie. W Bajtogrodzie jest skrzyżowań, połączonych dwukierunkowymi odcinkami dróg, które umożliwiają dotarcie z każdego skrzyżowania do wszystkich pozostałych. Burmistrz Bajtogrodu zamierza postawić na skrzyżowaniach jak najwięcej fotoradarów (na każdym co najwyżej jeden). Aby nie denerwować zbytnio bajtogrodzkich kierowców, przyjął on, że na każdej trasie może stać co najwyżej fotoradarów.
Innymi słowy, w zadaniu mamy dane drzewo o wierzchołkach i mamy zaznaczyć w nim jak najwięcej wierzchołków tak, by na każdej ścieżce prostej było zaznaczonych co najwyżej wierzchołków.
Zadanie ma całkiem proste rozwiązanie zachłanne. Podzielmy wierzchołki na warstwy (Rys. 1). W -tej warstwie (licząc od 1) będą znajdować się wierzchołki, które zostają liśćmi po usunięciu warstw o numerach Jeśli jest parzyste, to zaznaczamy wierzchołki na pierwszych warstwach (oczywiście, jeśli jest mniej niż warstw, to bierzemy wszystko). Jeśli jest nieparzyste, to zaznaczamy warstw oraz dowolny inny wierzchołek (jeśli jakiś pozostał).
Powyższy pomysł można zrealizować w czasie : utrzymujemy kolejkę wierzchołków o stopniu 1 i usuwamy kolejne warstwy, uaktualniając stopnie wierzchołków.
Alternatywne rozwiązanie wyznacza numery warstw dla wierzchołków, korzystając z metody programowania dynamicznego. Numer warstwy dla wierzchołka jest to druga co do wielkości wysokość poddrzewa zaczepionego w dziecku plus 1.
Pozostaje nam pokazać poprawność algorytmu zachłannego. Zauważmy, że wystarczy badać, czy warunek poprawności (nie więcej niż zaznaczonych wierzchołków na ścieżce) jest spełniony na każdej ścieżce prostej od liścia do liścia. Oczywiste jest, że nasz algorytm znajduje poprawny podzbiór wierzchołków, i należy wykazać, że jest on optymalny (najliczniejszy). Ponadto widać, że dołożenie dowolnego wierzchołka do znalezionego podzbioru powoduje, że podzbiór staje się niepoprawny.
Ustalmy parzyste i oznaczmy przez zbiór wierzchołków z pierwszych warstw. Weźmy dowolne rozwiązanie optymalne i załóżmy, że pewien wierzchołek nie został w tym rozwiązaniu zaznaczony (Rys. 2). Jeśli jest więcej takich wierzchołków, to weźmy ten z warstwy o najmniejszym numerze (i oznaczmy numer tej warstwy przez ). Rozważmy pewien zaznaczony wierzchołek który jest na warstwie wyższej niż i taki, że pomiędzy i nie ma zaznaczonych wierzchołków (gdyby wierzchołek nie istniał, to by znaczyło, że rozwiązanie ma za mało zaznaczonych wierzchołków, aby być optymalne). Pokażemy teraz, że usuwając ze zbioru zaznaczonych wierzchołków i dodając dostaniemy poprawne rozwiązanie.
Rozważmy zatem dowolną ścieżkę od liścia do liścia i pokażmy, że po zamianie zawiera ona nadal nie więcej niż zaznaczonych wierzchołków. Podejrzana ścieżka musi zawierać wierzchołek Jeśli zawiera również wierzchołek to po zamianie liczba zaznaczonych wierzchołków w nie zmieni się. Załóżmy zatem, że nie zawiera i rozważmy dowolną ścieżkę od liścia do liścia która zawiera oba wierzchołki i Niech będzie wierzchołkiem pomiędzy a który rozdziela te ścieżki. Ścieżka z do zawierała przed zamianą co najmniej zaznaczonych wierzchołków na jej końcu (bo założyliśmy, że najmniejsza warstwa z niezaznaczonym wierzchołkiem to ) plus dodatkowo wierzchołek Z kolei ścieżka z do po zamianie zawiera dokładnie wierzchołków (pamiętamy, że pomiędzy a nie ma zaznaczonych wierzchołków). Zatem poprawna przed zamianą ścieżka z do zawierała co najmniej tyle zaznaczonych wierzchołków, co ścieżka po zamianie. To dowodzi poprawności ścieżki
Tak więc, korzystając wielokrotnie z udowodnionego faktu, stwierdzamy, że istnieje rozwiązanie optymalne, które zaznacza wszystkie wierzchołki z zatem zbiór wierzchołków generowany przez nasz algorytm jest najliczniejszy. Dowód dla nieparzystego zostawiamy jako ćwiczenie dla Czytelnika.