Przeskocz do treści

Delta mi!

Informatyczny kącik olimpijski

Skarb

Tomasz Idziaszek

o artykule ...

  • Publikacja w Delcie: październik 2014
  • Publikacja elektroniczna: 01-10-2014

Zadanie Skarb pojawiło się w kwalifikacjach do konkursu Google Code Jam 2013.

obrazek

Mamy cztery szkatułki i trzy zamknięte klucze. Rodzaje kluczy i kłódek oznaczone są literami greckimi. Początkowo mamy jeden klucz rodzaju math Jedna z kolejności otwarcia wszystkich szkatułek to 2, 1, 4, 3. Jeśli zaczniemy od otwarcia szkatułki 1, to nie będziemy w stanie otworzyć już żadnej innej.

Mamy cztery szkatułki i trzy zamknięte klucze. Rodzaje kluczy i kłódek oznaczone są literami greckimi. Początkowo mamy jeden klucz rodzaju math Jedna z kolejności otwarcia wszystkich szkatułek to 2, 1, 4, 3. Jeśli zaczniemy od otwarcia szkatułki 1, to nie będziemy w stanie otworzyć już żadnej innej.

Zadanie. W skarbcu znajduje się math szkatułek, każda z nich zamknięta na kłódkę, która może być otwarta kluczem określonego rodzaju. W szkatułkach, oprócz kosztowności, mogą znajdować się klucze, które można wykorzystać do otwarcia innych szkatułek (w sumie jest math kluczy). Klucz, którym otworzyliśmy szkatułkę, nie może być użyty ponownie. Wchodząc do skarbca, mamy już kilka kluczy. Znając zawartość szkatułek, należy stwierdzić, czy istnieje taka kolejność ich otwierania, która pozwoli na otwarcie ich wszystkich (patrz rysunek).

Zadanie jest całkiem trudne, spróbujmy więc rozwiązać jego prostszy wariant, w którym zaczynamy z jednym kluczem rodzaju math a w każdej szkatułce jest co najwyżej jeden klucz. Zauważmy, że następujący warunek jest konieczny, by rozwiązanie istniało:

(A) kluczy ustalonego rodzaju musi być co najmniej tyle, ile jest kłódek tego rodzaju.

W szczególności oznacza to, że co najwyżej jedna szkatułka może być pusta. Otwarcie szkatułki zamkniętej na kłódkę rodzaju math i zawierającej klucz rodzaju math skutkuje wymienieniem klucza math na klucz math Sytuację możemy więc przedstawić za pomocą skierowanego multigrafu math którego wierzchołkami będą rodzaje kluczy, a skierowana krawędź math będzie istnieć dla każdej szkatułki zamkniętej na kłódkę rodzaju math która zawiera w sobie klucz rodzaju math Każda ścieżka w math startująca z wierzchołka math opisuje możliwą do zrealizowania procedurę otwierania szkatułek (otwieramy szkatułki odpowiadające kolejnym krawędziom ścieżki). Innymi słowy, rozwiązanie istnieje, jeśli w multigrafie math istnieje ścieżka Eulera z wierzchołka math Czytelnicy na pewno znają warunki, jakie musi spełniać skierowany multigraf, aby taka ścieżka istniała: (a) każdy wierzchołek musi mieć stopień wyjściowy równy wejściowemu (oprócz co najwyżej dwóch, w których te liczby mogą się różnić o 1) oraz (b) graf musi być (słabo) spójny.

Nietrudno się przekonać, że warunek (a) wynika z warunku (A) i tego, że w każdej szkatułce jest co najwyżej jeden klucz. Jeśli założymy, że warunek (a) jest spełniony, to warunek (b) jest równoważny temu, że

(B)
dla każdego rodzaju klucza da się zdobyć co najmniej jeden klucz tego rodzaju.

Nieprzypadkowo wyróżniliśmy warunki (A) i (B). Okazuje się bowiem, że są one konieczne i wystarczające do tego, by istniało rozwiązanie zadania w pełnej ogólności. (Tym razem w math mamy krawędź math dla każdego klucza rodzaju math zamkniętego w szkatułce na kłódkę rodzaju math) Konieczność jest oczywista. Ponadto jeśli początkowa konfiguracja szkatułek spełnia warunek (A), to otwieranie szkatułek tego warunku nie popsuje (otwarcie szkatułki "zużywa" nam jeden klucz i kłódkę tego samego rodzaju). Pozostaje zatem udowodnić, że dla każdej konfiguracji spełniającej oba warunki istnieje szkatułka, której otworzenie doprowadzi do konfiguracji spełniającej warunek (B).

obrazek

Załóżmy, że mamy klucz dowolnego rodzaju math który otwiera pewną szkatułkę. Jeśli mamy wszystkie klucze tego rodzaju, to z warunku (A) możemy otworzyć wszystkie szkatułki zamknięte na kłódki rodzaju math i warunek (B) będzie nadal spełniony.

W przeciwnym przypadku istnieje szkatułka zawierająca klucz rodzaju math a z warunku (B) wynika, że istnieje ciąg rodzajów kluczy math który pozwala na zdobycie klucza math zakładając posiadanie przez nas klucza math Załóżmy, że jest to najkrótszy taki ciąg, zatem math dla math

Jeśli math to możemy użyć klucza rodzaju math do otwarcia dowolnej szkatułki. Aby pokazać, że nie popsuje to warunku (B), rozważmy klucz dowolnego rodzaju math (być może math) i ciąg rodzajów kluczy math który pozwalał go zdobyć. Jedyna wątpliwość pojawia się, gdy math występuje w tym ciągu, zatem ciągi te mają jakiś element wspólny. Niech math będzie największym takim indeksem, że math równa się pewnemu math Wtedy, po użyciu klucza math możemy nadal dostać się do klucza math wykonując operacje z ciągu math

Z kolei jeśli math to otwieramy szkatułkę zawierającą klucz rodzaju math i, powtarzając powyższe rozumowanie, również dowodzimy, że warunek (B) jest nadal spełniony.

Ostatecznie udowodniliśmy, że dla każdej konfiguracji spełniającej warunki (A) i (B) istnieje szkatułka, którą możemy otworzyć, aby uzyskać nową konfigurację również spełniającą oba warunki. Wykonując tę operację math razy, otworzymy wszystkie szkatułki. Jeśli chodzi o implementację, to sprawdzenie warunku (A) jest trywialne, zaś warunek (B) sprowadza się do przeszukania multigrafu math Można to zrobić w czasie math