Omówienie zadania Wyjścia ewakuacyjne (III etap XXXI OI)
Drzewo
Plan budynku będziemy przedstawiać jako graf: pomieszczenia to wierzchołki grafu, a korytarze to krawędzie między nimi. Warunek z treści zadania, że pomiędzy każdą parą pomieszczeń można przejść bez zawracania na dokładnie jeden sposób, oznacza, że graf jest drzewem.
Ponadto, rozwiązując to zadanie warto myśleć o drzewie ukorzenionym. Wybór korzenia nie ma znaczenia; możemy przyjąć, że korzeniem drzewa będzie wierzchołek numer
Podzadanie 1 — ścieżka
Zastanawiając się nad tym, jak najlepiej rozmieścić wyjścia na ścieżce, łatwo przekonać się o poprawności podejścia zachłannego. Ścieżkę będziemy analizować od jednego z końców, powiedzmy od dołu, czyli od wierzchołka numer
Podzadanie 2 — same jedynki
W drugim podzadaniu, w każdym wierzchołku przebywa jedna osoba, a każda krawędź ma przepustowość
Jak możemy szukać takiego zbioru? Tutaj podejście zachłanne również działa. Będziemy analizować wierzchołki drzewa w kierunku od liści do korzenia. Jeśli rozważany wierzchołek
Podzadanie 3 — przypadek ogólny
Łatwo się domyślić, że w ogólnym przypadku także będziemy analizować drzewo w kierunku od liści do korzenia i także będziemy postępować zachłannie. Rozważając jakieś poddrzewo, chcemy postawić w nim jak najmniej wyjść. Jednocześnie wyjścia te chcemy umieścić jak najwyżej (czyli jak najbliżej korzenia drzewa). Intuicyjnie, im wyżej jest wyjście, tym większa szansa, że pomoże nam ono obsłużyć wierzchołki spoza danego poddrzewa. Jednocześnie, umieszczenie wyjść jak wyżej minimalizuje liczbę osób (z wierzchołków położonych blisko korzenia rozważanego poddrzewa), które nie zostaną obsłużone przez żadne wyjście w tym poddrzewie i będą musiały z niego wyjść w górę — do części drzewa, którą dopiero chcemy przetworzyć.
To samo bardziej formalnie
Opiszemy teraz nieco dokładniej powyższe postępowanie zachłanne i uzasadnimy jego poprawność.
Skupmy naszą uwagę na pewnym (dowolnym) poddrzewie naszego drzewa. Niech
- wybór wierzchołków tego poddrzewa, które stają się wyjściami ewakuacyjnymi,
- kierunki wskazywane przez strzałki w pozostałych jego wierzchołkach (pozwalamy, aby strzałka w wierzchołku
wskazywała w górę — w kierunku rodzica, znajdującego się już poza rozważanym poddrzewem).
Muszą być przy tym spełnione warunki z zadania: idąc z dowolnego wierzchołka w kierunkach wskazywanych przez strzałki dojdziemy do pewnego wyjścia ewakuacyjnego lub wyjdziemy z rozważanego poddrzewa. Jednocześnie, sumaryczna liczba osób przechodzących jakąkolwiek krawędzią nie może przekroczyć jej przepustowości; dotyczy to także osób wychodzących z naszego poddrzewa krawędzią prowadzącą z
Wynikiem rozwiązania nazwiemy parę liczb
Aby powyższe definicje miały sens również dla całego drzewa (a więc gdy
Poniższy lemat mówi, że podejście zachłanne umożliwia uzyskanie optymalnego rozwiązania.
Lemat. Ustalmy wierzchołek
Dowód. Rozważmy dodatkowo pewne optymalne rozwiązanie
- Załóżmy najpierw, że dla pewnego
zachodzi . Wówczas definiujemy rozszerzając rozwiązania o dodatkowe wyjście w wierzchołku . Łatwo zobaczyć, że dostajemy w ten sposób poprawne rozwiązanie: w obrębie każdego każda osoba albo trafia do wyjścia w swoim poddrzewie, albo do (gdzie jest wyjście), nie przekraczając przepustowości. Łatwo też zobaczyć, że liczba wyjść w jest nie większa niż : w którymś mamy co najmniej o jedno wyjście mniej niż w , co równoważy obecność w dodatkowego wyjścia w , które być może nie było obecne w rozwiązaniu . Ponadto wyjście w powoduje, że z rodzica może zejść do tyle osób, na ile pozwala przepustowość krawędzi między i jego rodzicem; zatem liczba jest najmniejsza możliwa. To kończy dowód w tym przypadku. - W przeciwnym przypadku mamy
dla każdego . W tej sytuacji definiujemy rozszerzając rozwiązania na podstawie : jeśli w było wyjście w , to budujemy je również w , a jeśli w była strzałka w , to w umieszczamy tam strzałkę w tę samą stronę. Optymalność rozwiązań mówi nam, że . Oznacza to, że w z wierzchołka wychodzi do nie więcej osób, niż było ich w (sytuacja nieujemnych ), bądź też w do wierzchołka może zejść z nie mniej osób, niż mogło w (sytuacja ujemnych ), bądź nawet w jakieś osoby mogą zejść z do podczas gdy w wychodziły z do . Tak czy inaczej, teraz (czyli w ) w wierzchołku znajdzie się mniej osób niż przy rozwiązaniu i możemy nadal wysłać je w tę samą stronę, co poprzednio. Oznacza, to że jest poprawnym rozwiązaniem, a liczba jest nie większa niż .
To co właściwie robimy?
Jak to co? Jak już powiedzieliśmy, szukamy rozwiązania optymalnego dla coraz to większych poddrzew. Przyjrzyjmy się sytuacji jak w powyższym lemacie: analizujemy wierzchołek
- Zawsze możemy po prostu postawić wyjście w wierzchołki
. Wówczas wynikiem będzie ; w szczególności liczba osób, które mogą zejść z góry do , jest ograniczona jedynie przez przepustowość ). - Druga opcja to skierowanie wszystkich
osób z w górę, do rodzica . Jest to możliwe pod warunkiem, że , a wynikiem takiego rozwiązania będzie . - Trzecia opcja (a dokładniej
opcji), to skierowanie wszystkich osób z w dół, do pewnego . Jest to możliwe pod warunkiem, że , czyli gdy wierzchołek jest faktycznie w stanie przyjąć co najmniej osób. Może on wówczas przyjąć jeszcze dodatkowe osób, które mogą przyjść z góry (ale tak czy inaczej z góry nie może przyjść więcej niż osób). Wynikiem takiego rozwiązania będzie zatem .
Możemy więc po prostu rozważyć każdą z tych
Powyższe rozważania możemy zupełnie wprost zaimplementować, aplikując je do kolejnych wierzchołków, począwszy od liści i idąc w stronę korzenia. Otrzymujemy program działający w czasie