Informatyczny kącik olimpijski
Oblodzone drogi
W tym miesiącu omówimy zadanie Icy Roads z obozu w Petrozawodsku z roku 2013.
Zadanie. Sieć drogowa w mieście składa się z pionowych ulic oraz poziomych alei. Chcemy jak najszybciej dostać się ze skrzyżowania do skrzyżowania pokonując odcinków dróg. Niestety, drogi są oblodzone i jeździ się po nich dość wolno: przejechanie jednego odcinka -tej ulicy zajmuje czas zaś przejechanie jednego odcinka -tej alei zajmuje czas Należy wyznaczyć najszybszą trasę przejazdu.
Na rysunku 1 przedstawiono przykładową sieć i wyjaśniono, dlaczego algorytm zachłanny, który na każdym kolejnym skrzyżowaniu wybiera tę ulicę/aleję, która ma mniejszy czas przejazdu, nie jest poprawny.
Pomimo prostego sformułowania, zadanie jest trudne i wymaga kilku pomysłowych obserwacji. Główna idea rozwiązania będzie opierać się na sukcesywnym blokowaniu tych ulicąlei, którymi nie opłaca się jeździć. Na początek pokażemy, że jeśli jakaś ulica znajduje się pomiędzy dwiema ulicami o mniejszych czasach przejazdu, to można ją zablokować. Załóżmy, że w pewnym optymalnym rozwiązaniu przejeżdżamy odcinkami tej ulicy pomiędzy alejami oraz (Rys. 2). Niech oraz będą numerami tych niezablokowanych jeszcze ulic, pomiędzy którymi znajduje się ulica (przy pierwszym czytaniu można przyjąć ). Zgodnie z założeniem mamy Czas przejazdu wynosi Natomiast czasy przejazdu, gdybyśmy zamiast ulicy wybrali ulicę lub wynoszą odpowiednio oraz Widać jednak, że co najmniej jedna z tych tras ma czas nie większy niż optymalny:
Powtarzając powyższe rozumowanie, możemy zablokować część ulic w mieście tak, że czasy przejazdu pozostałych będą tworzyć ciąg unimodalny (najpierw będą maleć, osiągając minimum na pewnej ulicy a potem rosnąć). Zauważmy, że blokowanie ulic powoduje, że odległości między kolejnymi niezablokowanymi ulicami mogą się zwiększać (stąd konieczność uwzględnienia wartości i w powyższym dowodzie). Cały argument możemy niezależnie zastosować do alei (które zatem też będą tworzyć ciąg unimodalny, osiągając minimum na pewnej alei ). Druga obserwacja jest następująca: optymalna trasa będzie przechodziła przez skrzyżowanie najtańszej ulicy z najtańszą aleją. (Jeśli tak nie jest, to rozważamy punkt przecięcia trasy z ulicą oraz punkt przecięcia trasy z aleją Przejście pomiędzy tymi punktami po odcinkach ulicy oraz alei nie pogorszy rozwiązania.) Zatem możemy nasz problem podzielić na dwa niezależne problemy szukania trasy ze skrzyżowania do skrzyżowania oraz trasy ze skrzyżowania do skrzyżowania Bez straty ogólności możemy więc założyć, że ciągi i czasów przejazdu dla niezablokowanych ulic i alei są rosnące.
Pójdziemy jeszcze krok dalej i pokażemy silniejszy warunek na te ciągi, a mianowicie, że funkcje oraz dla niezablokowanych ulicąlei są wypukłe. Przez oznaczmy średni przyrost czasu na odcinek od ulicy do następnej niezablokowanej ulicy (analogicznie dla alei). Zatem dla rysunku 2 mamy (przy dodatkowym założeniu, że aleje i są sąsiednie):
Ponownie rozpisując wzory na czasy przejazdu trasami i dostajemy, że
Jeśli to co najmniej jeden z powyższych warunków jest spełniony, więc i można zablokować -tą ulicę. Powtarzając to rozumowanie, powodujemy w końcu, że ciągi oraz dla niezablokowanych ulicąlei są rosnące.
Pora na ostatnią obserwację: na tak poblokowanej sieci drogowej możemy już stosować algorytm zachłanny, tzn. na każdym skrzyżowaniu wybierać tę ulicęąleję, która ma mniejszy współczynnik średniego przyrostu czasu. A konkretnie: będąc na skrzyżowaniu -tej ulicy z -tą aleją wybieramy ulicę, jeśli a aleję, jeśli Dowód poprawności tego algorytmu przeprowadzimy przez indukcję po Dla teza jest oczywista (jesteśmy na ostatnim skrzyżowaniu i nie mamy co wybierać). Załóżmy zatem, że algorytm zachłanny działa poprawnie, jeśli startujemy z dowolnego skrzyżowania dla którego Ponadto załóżmy (Rys. 3), że jest spełnione ale w rozwiązaniu optymalnym wybieramy aleję, zatem jedziemy do skrzyżowania Z wypukłości mamy zatem tym bardziej jest spełnione więc z założenia indukcyjnego wynika, że w drugim ruchu wybierzemy ulicę, przesuwając się do skrzyżowania Te dwa ruchy kosztowały nas czas Jednakże rozwiązanie, w którym dostajemy się do skrzyżowania najpierw jadąc ulicą, a potem aleją, ma czas Nietrudno się przekonać, że warunek jest równoważny temu, że To pokazuje, że istnieje optymalne rozwiązanie, w którym pierwszym ruchem jest wybór ulicy, co kończy dowód.
Myślę, że Czytelnicy, którzy przebrnęli przez powyższy opis algorytmu nie będą mieli trudności, by zaimplementować go w optymalnej złożoności czasowej