Marcin JurdzińskiTomasz Waleń
Treść zadania, OpracowanieProgram wzorcowy


Gra w zielone


Gra w zielone jest grą dla dwóch graczy - nazwijmy ich Ania i Bolek - polegającą na przesuwania pionka po planszy.

Część pól planszy jest pokolorowana na zielono, a pozostałe są białe. Wszystkie pola są ponumerowane liczbami naturalnymi z zakresu 1... (a+b), pola o numerach z zakresu 1... a należą do Ani, natomiast pola o numerach (a+1)... (a+b) należą do Bolka.

Dla każdego pola dany jest zbiór następników, zawierający te pola planszy, do których można z niego przejść w jednym ruchu. Zbiory te zostały tak dobrane, że z pola należącego do Ani można przejść w jednym ruchu tylko na pole należące do Bolka i odwrotnie.

Na początku gry ustawiamy pionek na dowolnym polu, a następnie gracze na przemian przestawiają pionek ze swojego pola na dowolny następnik tego pola - należący do przeciwnika. Grę rozpoczyna właściciel pola, z którego zaczynamy rozgrywkę. Zakładamy, że wszystkie pola mają niepuste zbiory następników, a więc zawsze można wykonać ruch. Gra kończy się w momencie, gdy pionek stanie po raz drugi na tym samym polu. Jeśli w sekwencji ruchów, od pierwszego do powtórnego zajęcia tego pola, pionek stanął przynajmniej raz na polu zielonym, to wygrywa Ania, w przeciwnym przypadku wygrywa Bolek.

Powiemy, że Ania ma strategię wygrywającą dla danego pola początkowego, jeśli istnieje metoda gwarantująca jej wygraną w rozgrywce zaczynającej się od tego pola, niezależnie od tego, jakie ruchy będzie wykonywał Bolek.

Zadanie

Napisz program, który:

Wejście

W pierwszym wierszu pliku tekstowego gra.in zapisane są dwie nieujemne liczby całkowite a, b oddzielone pojedynczym odstępem, oznaczające odpowiednio: liczbę pól należących do Ani i liczbę pól należących do Bolka. Liczby a, b spełniają warunek: 1 leq a+b leq 3,000. W kolejnych a+b wierszach opisano pola planszy - najpierw pola należące do Ani, a następnie pola należące do Bolka. Wiersz o numerze i+1, dla 1 le i le a+b, zawiera na początku liczby całkowite z, k oddzielone pojedynczym odstępem, oznaczające odpowiednio kolor pola o numerze i (0 oznacza kolor biały, 1 - kolor zielony), oraz liczbę następników tego pola. Następnie w tym wierszu zapisane jest k liczb całkowitych (1 leq k < a+b), pooddzielanych pojedynczymi odstępami, będącymi numerami następników danego pola. Liczba pól zielonych na planszy nie przekracza 100. Suma liczb następników wszystkich pól na planszy nie przekracza 30 000.

Wyjście

Pierwszy wiersz pliku tekstowego gra.out powinien zawierać dokładnie jedną liczbę całkowitą p, oznaczającą liczbę pól, dla których Ania ma strategię wygrywającą. Następne p wierszy powinno zawierać numery tych pól zapisane w kolejności rosnącej - każda liczba powinna zostać zapisana w osobnym wierszu.

Przykład

Dla pliku wejściowego gra.in
5 3
0 2 6 7
0 3 6 7 8
0 1 8
1 1 7
1 1 8
1 2 1 2
0 2 1 2
0 2 3 4
poprawną odpowiedzią jest plik wyjściowy gra.out
5
1
2
4
6
7

Rozwiązanie

Ścisłe sformułowanie faktu, że w grze w zielone Ania ma strategię wygrywającą z danego pola początkowego nie jest banalne i jest zaledwie naszkicowane w treści zadania. Jego sprecyzowanie oraz algorytmiczną charakteryzację należy zatem do pewnego stopnia traktować jako część zadania postawionego przed uczestnikami olimpiady.

Przez P będziemy oznaczać zbiór wszystkich pól na planszy, a przez Z zbiór wszystkich pól zielonych.

Aby ułatwić opis strategii wygrywających w grze w zielone oraz ich poszukiwanie, wygodnie jest rozważyć następującą uproszczoną wersję gry. Niech X subseteq Z będzie pewnym zbiorem zielonych pól na planszy. Uproszczona gra w zielone toczy się w sposób podobny do zwyczajnej gry w zielone. Różnica polega na tym, że w uproszczonej grze w zielone rozgrywka może się zakończyć wcześniej: gdy pionek odwiedzi zielone pole ze zbioru X po raz pierwszy, rozgrywka zostaje przerwana i Ania zwycięża.

Przez Wymuś(X) oznaczamy zbiór pól, z których Ania ma strategię wygrywającą w uproszczonej grze w zielone. Zauważ, że Wymuś(X) jest zbiorem pól z których Ania może wymusić przesunięcie pionka na pewne zielone pole ze zbioru X w taki sposób, że pionek nie staje na żadnym polu dwa razy.

W poniższym fakcie wykazujemy, że rozwiązanie uproszczonej gry w zielone dla X = Z, tj. obliczenie zbioru Wymuś(Z), jest pomocne w ustaleniu pewnego zbioru pól, z których Bolek ma strategię wygrywającą w normalnej grze w zielone.

Fakt: Strategia wygrywająca dla Bolka
Bolek ma strategię wygrywającą z każdego pola, które nie jest w zbiorze Wymuś(Z).

Dowód. Fakt, że pole p nie należy do zbioru Wymuś(Z) oznacza, że w uproszczonej grze w zielone rozpoczynającej się w polu p, Bolek potrafi zapobiec dojściu do jakiegokolwiek zielonego pola. Cała rozgrywka toczy się więc i kończy w białej części planszy - to gwarantuje zwycięstwo Bolka w zwyczajnej grze w zielone z pola p. Box

Przykład:
W tym i w poniższych przykładach ilustrujemy pojęcia i fakty opisane w tym opracowaniu na przykładzie gry w zielone z przykładu z treści zadania.

Zauważ, że Z = (4, 5, 6) oraz Wymuś(Z) = (1, 2, 4, 5, 6.... W polach spoza zbioru Wymuś(Z), tj. w polach ze zbioru (3, 8), Bolek ma strategię wygrywającą polegającą na wybraniu pola 3 jako następnika w polu 8.

Następnie spróbujemy ustalić jakie warunki gwarantują, że strategia wygrywająca dla Ani w uproszczonej grze w zielone daje Ani zwycięstwo także w normalnej grze w zielone. W tym celu przydatne okazuje się pojęcie pułapki dla Bolka.

Definicja: Pułapka dla Bolka
Powiemy, że zbiór pól Wymuś(X) jest pułapką dla Bolka, jeśli dla każdego pola p ze zbioru X mamy:

  1. pole p należy do Ani i istnieje następnik pola p znajdujący się w zbiorze Wymuś(X); lub
  2. pole p należy do Bolka i każdy następnik pola p znajduje się w zbiorze Wymuś(X).

Przykład:
Niech X = (4, 6). Zbiór Wymuś(X) = (1, 2, 4, 6, 7... jest pułapką dla Bolka, ponieważ:

Fakt: Strategia wygrywająca dla Ani
Jeśli zbiór Wymuś(X) jest pułapką dla Bolka, to Ania ma strategię wygrywającą z każdego pola w zbiorze Wymuś(X).

Dowód. Rozważmy następującą strategię dla Ani:

Zauważ, że w każdej rozgrywce zgodnej z tą strategią, pionek nigdy nie opuszcza zbioru Wymuś(X). Co więcej, żaden cykl (tj. fragment rozgrywki rozpoczynający się i kończący w tym samym polu) w takiej rozgrywce nie składa się tylko z białych pól, ponieważ strategia Ani na białych polach jest wygrywająca w uproszczonej grze w zielone. Dlatego każda rozgrywka zgodna z powyższą strategią jest wygrywająca dla Ani w zwyczajnej grze w zielone. Box


Pozostaje nam do rozwiązania sytuacja, w której zbiór Wymuś(Z) nie jest pułapką dla Bolka. Niech Z_1 subseteq Z będzie zbiorem zielonych pól, które spełniają warunki [5]lub [6] definicji pułapki dla Bolka, dla X = Z.

Zauważ, że w zielonych polach nie należących do zbioru Z1, Bolek ma następującą strategię wygrywającą: najpierw przesuń pionek w jednym kroku do pola nie należącego do zbioru Wymuś(Z), a następnie użyj strategii wygrywającej zagwarantowanej przez Fakt [2]. Możemy zatem odrzucić zielone pola spoza zbioru Z1, jako ``bezużyteczne'' dla Ani.

Aby ponowić próbę użycia Faktu [8] do wyznaczenia strategii wygrywającej dla Ani, rozważmy zbiór Wymuś(Z1). Jeśli ten zbiór jest pułapką dla Bolka, to rozwiązanie gry w zielone jest gotowe (można wykazać - patrz dowód ogólniejszego Faktu [] poniżej - że także we wszystkich białych polach spoza zbioru Wymuś(Z1) Bolek ma strategię wygrywającą.) W przeciwnym wypadku należy ponownie odrzucić zielone pola, które okazały się bezużyteczne dla Ani, itd.

Powyższe rozumowanie motywuje następującą metodę obliczania kolejnych, coraz mniejszych zbiorów zielonych pól, które kandydują do roli pól dających Ani strategię wygrywającą (poprzez Fakt [8]).


1procedure NajwiększaPułapkaDlaBolka
2begin
3      Z0 := Z
4      i := 0
5      while Wymuś(Zi) nie jest pułapką dla Bolka do
6      begin
7            Z_(i+1) := zbiór pól z Zi spełniających warunki~\ref{definicja:pulapka-1}\ lub~\ref{definicja:pulapka-2}\ definicji~\ref{definicja:pulapka-dla-bolka}
8            i := i + 1
9      end
10end


Przykład:

Z przykładu [3] mamy Z_0 = Z = (4, 5, 6) oraz Wymuś(Z_0) = (1, 2, 4, 5,.... Zauważ, że Z0 nie jest pułapką dla Bolka, bo pole 5 należy do Ani, ale jedyny następnik pola 5, tj. pole 8, nie należy do zbioru Wymuś(Z0). Pole 5 jest jedynym polem z Z0 nie spełniającym warunków [5] lub [6] definicji [4], więc Z_1 = (4, 6). Z przykładu [7] wiemy, że zbiór Wymuś(Z1) jest pułapką dla Bolka.

Zauważ, że jeśli warunek kontynuacji wykonywania pętli 5:-9: jest spełniony, to istnieje przynajmniej jedno zielone pole w zbiorze Zi nie spełniające warunków 1 lub 2definicji [4]. Dlatego ciąg zbiorów Zi jest malejący, a stąd wynika, że liczba iteracji pętli 5:-9: wynosi O(k).

Niech ell będzie najmniejszą liczbą dla której zbiór Wymuś(Z_ell) jest pułapką dla Bolka. Oczywiście Ania ma strategię wygrywającą ze zbioru Wymuś(Z_ell) - wynika to z Faktu [8]. Aby wykazać, że Wymuś(Z_ell) to zbiór wszystkich pól z których Ania ma strategię wygrywającą, wystarczy udowodnić, że z każdego pola spoza zbioru Wymuś(Z_ell), strategię wygrywającą ma Bolek.

Fakt: Strategia wygrywająca dla Bolka: ogólny przypadek

Dla każdego i leq ell, Bolek ma strategię wygrywającą z każdego pola spoza zbioru Wymuś(Zi).

Dowód. Dowód przebiega przez indukcję ze względu na i. Zauważ, że dla i = 0 teza wynika wprost z Faktu [2].

Załóżmy, że dla pewnego i < ell, Bolek ma strategię wygrywającą z każdego pola spoza zbioru Wymuś(Zi). Wykażemy, że wtedy Bolek ma także strategię wygrywającą z każdego pola spoza zbioru Wymuś(Z_(i+1)).

Wystarczy udowodnić, że Bolek ma strategię wygrywającą z każdego pola ze zbioru Wymuś(Z_i) setminusWymuś(Z_(i+1)) - dla pól nie należących do zbioru Wymuś(Zi) teza wynika z hipotezy indukcyjnej.

Rozważmy dwa rodzaje pól ze zbioru Wymuś(Z_i) setminusWymuś(Z_(i+1)):

  1. Jeśli pole jest zielone, to nie spełnia warunków 1 lub 2 definicji [4], więc Bolek może z tego pola w jednym kroku wymusić przesunięcie pionka poza zbiór Wymuś(Zi), skąd ma strategię wygrywającą (z hipotezy indukcyjnej).
  2. Jeśli pole jest białe, to Bolek korzysta ze strategii w uproszczonej grze w zielone, która zapobiega dojściu pionka do zbioru Wymuś(Z_(i+1)). Jeśli w wyniku rozgrywki pionek stanie na jednym z zielonych pól w zbiorze Wymuś(Z_i) setminusWymuś(Z_(i+1)), wtedy Bolek postępuje jak w przypadku [10] i wygrywa. W przeciwnym razie rozgrywka toczy się i kończy w białej części zbioru Wymuś(Z_i) setminusWymuś(Z_(i+1)), więc jest wygrywająca dla Bolka. Box


Aby precyzyjnie oszacować koszt czasowy działania algorytmu NajwiększaPułapkaDlaBolka musimy ustalić, jaki jest koszt rozwiązywania uproszczonej gry w zielone, tj. obliczania zbioru Wymuś(X). Powiemy, że warunek AniaWymusza(T, p) zachodzi dla pewnego zbioru pól T, oraz pola p, jeśli mamy:

Ćwiczenie: Poprawność algorytmu ObliczZbiórWymuś

Wykaż, że poniższa procedura ObliczWymuś(X) wyznacza poprawnie zbiór pól z których Ania ma strategię wygrywającą w uproszczonej grze w zielone, tj. zbiór Wymuś(X).


1procedure ObliczWymuś(X)
2begin
3      <i>W</i> := X
4      while istnieje pole p notin <i>W</i> takie, że \emph{AniaWymusza}(W, p) do
5            dodaj pole p do zbioru W
6    {\bf return}(W)
7end


Procedurę ObliczWymuś można zaimplementować tak, aby działała w czasie O(m), gdzie m jest sumą liczb następników dla wszystkich pól. Przykładowa implementacja znajduje się na załączonej dyskietce.

Powyższą algorytmiczną analizę struktury strategii wygrywających dla Ani i Bolka w grze w zielone można podsumować w następujący sposób.

Twierdzenie: Poprawność algorytmu NajwiększaPułapkaDlaBolka

Niech ell będzie najmniejszą liczbą, dla której w procedurze NajwiększaPułapkaDlaBolka zbiór Wymuś(Z_ell) jest pułapką dla Bolka. Wtedy Ania ma strategię wygrywającą z pól ze zbioru Wymuś(Z_ell), a Bolek ma strategię wygrywającą ze wszystkich pozostałych pól. Algorytm można zaimplementować tak, by działał w czasie O(k cdot m), gdzie k jest liczbą zielonych pól, a m jest sumą liczb następników dla wszystkich pól.

Inne rozwiązania

W tym podrozdziale omówimy alternatywny warunek wystarczający i konieczny dla istnienia strategii wygrywających dla Bolka lub Ani w Grze w Zielone. Interesującą cechą tego warunku jest jego lokalność: jeśli każde pole jest w odpowiedniej, dość łatwej do sprawdzenia relacji ze zbiorem jego następników, to mamy gwarancję, że istnieje ``globalna'' strategia wygrywająca dla odpowiedniego gracza.

Definicja: Dobre etykietowanie dla Bolka

Rozważmy funkcję beta : P to (0, 1, 2...: z każdym polem p in P, związana jest etykieta beta(p), która jest liczbą naturalną nie większą niż k, lub symbolem infty. Przyjmujemy umownie, że infty jest większa od każdej liczby naturalnej, czyli i < infty, dla każdej liczby naturalnej i. Powiemy, że etykietowanie beta jest dobre dla Bolka w polu p, jeśli beta(p) = infty lub spełnione są następujące warunki:

gdzie warunek PostępBolka(beta; p, r) jest spełniony wtedy i tylko wtedy gdy:
  1. beta(p) > beta(r), jeśli pole p jest zielone, oraz
  2. beta(p) geq beta(r), jeśli pole p jest białe.
Mówimy, że etykietowanie beta jest dobre dla Bolka, jeśli beta jest dobre dla Bolka we wszystkich polach planszy.

Przykład:
Zauważ, że zbiór P pól Gry w Zielone z treści zadania jest równy P = (1, 2, 3, dots, .... Niech etykietowanie beta : P to (0, 1, 2... będzie zdefiniowane przez następującą tabelę.


  begin(array)(|c||...
Etykietowanie beta jest dobre dla Bolka ponieważ:

Za tą-na pierwszy rzut oka-zawiłą definicją kryje się następująca prosta intuicja. O etykiecie beta(p) pola p - o ile ta etykieta jest liczbą naturalną, a nie symbolem infty - można myśleć jako o górnym ograniczeniu na liczbę zielonych pól, które Bolek może być zmuszony (przez Anię) odwiedzić w rozgrywce, jeśli Bolek wybiera zawsze następnika o jak najmniejszej etykiecie. Wykażemy, że wybieranie następnika o najmniejszej etykiecie gwarantuje Bolkowi zwycięstwo w grze w zielone, jeśli etykietowanie jest dobre dla Bolka.

Fakt: Strategia wygrywająca dla Bolka

Jeśli etykietowanie beta : P to (0, 1, 2... jest dobre dla Bolka, to Bolek ma strategię wygrywającą z każdego pola p takiego, że beta(p) neq infty.

Dowód: Wykażemy, że następująca strategia jest wygrywająca dla Bolka: w każdym polu p należącym dla Bolka, Bolek wybiera następnika r pola p, o jak najmniejszej etykiecie beta(r). Zauważmy, że z definicji dobrego etykietowania dla Bolka wynika, że wtedy dla każdej rozgrywki p1, p2, p3, ..., pi mamy


  beta(p_1) geq bet...
Niech pj = pi, dla pewnego j < i, tj. pj = pi jest pierwszym polem na którym pionek stanął dwa razy. Z powyższego warunku wynika, że beta(p_j) geq beta(p..., więc musi być beta(p_j) = beta(p_(.... Z definicji dobrego etykietowania dla Bolka - a dokładniej z punktu 1 definicji warunku PostępBolka(beta, p, r) - wynika, że pola p_j, p_(j+1), p_(j+2... są białe. Inaczej mówiąc, żadne pole odwiedzone pomiędzy pierwszą i drugą wizytą w polu pj = pi nie jest zielone, czyli rozgrywka jest wygrywająca dla Bolka.
Box


1procedure PodnośEtykietowanie
2begin
3      dla każdego pola p do beta(p) := 0
4      while beta nie jest dobre dla Bolka do
5      begin
6            wybierz pole p w którym beta nie jest dobre dla Bolka
7            beta(p) := <i>Popraw</i>(...
8      end
9end

Powyższy fakt oznacza, że istnienie dobrego etykietowania beta dla Bolka, dla którego zachodzi beta(p) neq infty, jest warunkiem wystarczającym dla istnienia strategii wygrywającej dla Bolka z pola p. Poniżej naszkicujemy dowód faktu, że jest to również warunek konieczny, oraz przedstawimy wydajny sposób znajdowania dobrych etykietowań. Rozważmy następującą procedurę poszukiwania dobrego etykietowania dla Bolka:


gdzie Popraw(beta, p) to najmniejsza etykieta nie mniejsza od beta(p), która przypisana polu p gwarantuje, że etykietowanie beta staje się dobre w polu p. Wartość Popraw(beta, p) można obliczyć na przykład tak:


emph(Popraw)(beta, ...
gdzie emph(MaxMin)(beta, p... jest zdefiniowane w następujący sposób:

emph(MaxMin)(beta, ...
Warto tu zwrócić uwagę na to, że Popraw(beta, p) geq beta(p... oraz, że Popraw(beta, p) > beta(p), jeśli etykietowanie beta nie jest dobre w polu p.

Przykład:
Dla skrócenia i uproszczenia ilustracji działania algorytmu
PodnośEtykietowanie
wprowadzamy następującą notację na oznaczenie ciągu kilku operacji Popraw: begin(eqnarray*)
  m... Rozważmy następujące wykonanie procedury PodnośEtykietowanie:


  begin(array)(|c||...
Etykietowanie beta_6 jest dobre dla Bolka. Zauważ, że etykietowanie beta_6 jest ``mniejsze'' niż etykietowanie beta z przykładu [12], w tym sensie, że dla każdego pola p in P, mamy beta_6(p) leq beta(p....

Można myśleć o procedurze PodnośEtykietowanie jako o metodzie przybliżania etykietowania beta ,,z dołu'', do ,,najmniejszego'' dobrego etykietowania. Istotnie, początkowe etykietowanie beta = beta_0, gdzie beta_0(p) = 0, dla każdego pola p, jest ,,mniejsze'' niż jakiekolwiek inne etykietowanie. (Dla ścisłości, mówimy, że etykietowanie beta jest ,,mniejsze'' lub równe niż etykietowanie beta', jeśli beta(p) leq beta'(p), dla każdego pola p.) Kolejne ,,poprawki'' polegające na podnoszeniu wartości etykietowania beta w polu, w którym beta nie jest dobre dla Bolka, zachowują własność, że etykietowanie beta jest mniejsze lub równe niż każde dobre etykietowanie. Jest tak dlatego, ponieważ w procedurze PodnośEtykietowanie wartość etykiety w pewnym polu jest zawsze podnoszona tylko o tyle, o ile to jest konieczne, aby etykietowanie stało się dobre dla Bolka w tym polu.

Przykład:
Etykietowanie beta_6 : P to (1, 2,...:


  begin(array)(|c||...
z przykładu [14] jest najmniejszym dobrym etykietowaniem dla Bolka w grze z treści zadania. Inaczej mówiąc, etykietowanie beta_6 jest mniejsze nie tylko od dobrego etykietowania beta dla Bolka z przykładu [12], ale jest nie większe niż każde dobre etykietowanie dla Bolka w tej grze.

Zauważ, że każde pole może być poprawione przez procedurę PodnośEtykietowanie co najwyżej k+1 razy, zatem liczba powtórzeń pętli 4:-8: wynosi O(k cdot n).

Co więcej, etykietowanie beta po zakończeniu procedury PodnośEtykietowanie jest dobrym etykietowaniem dla Bolka; w ,,najgorszym'' przypadku mamy beta(p) = infty, dla każdego pola p - ,,największe'' dobre etykietowanie. Z faktu [13] wynika, że Bolek ma strategię wygrywającą z każdego pola p takiego, że beta(p) neq infty. Najmniejsze dobre etykietowanie dla Bolka, tj. etykietowanie beta obliczane przez procedurę PodnośEtykietowanie, jest szczególnie interesujące ponieważ można z niego łatwo odczytać rozwiązanie gry w zielone, tj. zbiór pól z których istnieje strategia wygrywająca dla Ani.

Twierdzenie: Strategia wygrywająca dla Ani

Etykietowanie beta : P to (0, 1, 2... obliczone przez procedurę PodnośEtykietowanie ma taką własność, że Ania ma strategię wygrywającą z pola p wtedy i tylko wtedy gdy beta(p) = infty.

Dowód tego twierdzenia nie jest natychmiastowy i wymaga dość subtelnej argumentacji. Poniżej szkicujemy przydatne w tym celu pojęcia oraz ogólny tok rozumowania. Wypełnienie szczegółów dowodu pozostawiamy jako ćwiczenie dla dociekliwego czytelnika.

Definicja: Dobre etykietowanie dla Ani

Rozważmy etykietowanie alpha : P to (0, 1, .... Powiemy, że etykietowanie alpha jest dobre dla Ani w polu p, jeśli alpha(p) = infty lub spełnione są następujące warunki:

gdzie warunek PostępAni(alpha; p, r) oznacza, że alpha(p) > alpha(r), jeśli pole p jest białe. Mówimy, że etykietowanie alpha jest dobre dla Ani, jeśli alpha jest dobre dla Ani we wszystkich polach planszy.

Przykład:
Etykietowanie alpha : P to (0, 1, ... zdefiniowane przez następującą tabelę jest dobre dla Ani.


  begin(array)(|c||...

Podobnie jak w przypadku dobrych etykietowań dla Bolka, można skonstruować strategię wygrywającą dla Ani, jeśli dane jest dobre etykietowanie dla Ani. Dowód następującego łatwego faktu pozostawiamy czytelnikowi.

Ćwiczenie: Strategia wygrywająca dla Ani
Wykaż, że jeśli etykietowanie alpha : P to (0, 1, ... jest dobre dla Ani, to Ania ma strategię wygrywającą z każdego pola p takiego, że alpha(p) neq infty.

W celu wykazania Twierdzenia [15] do procedury PodnośEtykietowanie dodamy instrukcje obliczające etykietowanie alpha : P to (0, 1, .... Zauważ, że te dodatkowe instrukcje nie mają wpływu na obliczenie etykietowania beta i służą nam tylko jako pomoc w dowodzie Twierdzenia [15]. Rozważmy następującą modyfikację procedury PodnośEtykietowanie:
1procedure PodnośEtykietowanie'
2begin
3      dla każdego pola p do begin beta(p) := 0; alpha(p) := infty end
4      while beta nie jest dobre dla Bolka do
5      begin
6            wybierz pole p w którym beta nie jest dobre dla Bolka;
7            beta(p) := <i>Popraw</i>(...;
8            if beta(p) = infty then alpha(p) := <i>Ustal</i>(...
9      end
10end


gdzie


emph(Ustal)(beta, p...
oraz

emph(MinMax)(alpha,...

Przykład:

Przekonaj się, że etykietowanie alpha obliczane przez procedurę
PodnośEtykietowanie'
jest równe etykietowaniu alpha z Przykładu [16].

Ćwiczenie: Dobre etykietowanie dla Ani

Wykaż, że etykietowanie: alpha : P to (0, 1, ... obliczane przez procedurę PodnośEtykietowanie' jest dobre dla Ani.
Wskazówka. Wykaż, że gdyby istniało pole p takie, że alpha(p) neq infty i alpha nie jest dobrym etykietowaniem dla Ani w polu p, to beta(p) neq infty, gdzie beta jest najmniejszym dobrym etykietowaniem dla Bolka.

Powyższą analizę dobrych etykietowań dla Ani i Bolka można podsumować w następujący sposób.

Twierdzenie: Poprawność algorytmu PodnośEtykietowanie

Niech beta będzie etykietowaniem obliczonym przez procedurę PodnośEtykietowanie. Wtedy Ania ma strategię wygrywającą z każdego pola p dla którego zachodzi beta(p) = infty, a Bolek ma strategię wygrywającą ze wszystkich pozostałych pól.

Ćwiczenie: Wydajna implementacja algorytmu

Zaimplementuj algorytm PodnośEtykietowanie w taki sposób, aby czas działania twojego programu był O(k cdot m).
Wskazówka. Zaprojektuj strukturę danych umożliwiającą ustalanie w czasie O(1), czy istnieje pole p, w którym aktualne etykietowanie nie jest dobre dla Bolka, oraz poprawianie wartości etykietowania w polu p i aktualizację struktury danych w czasie O(d), gdzie d jest sumą liczb, następników pola p oraz jego ,,poprzedników'', tj. pól dla których p jest następnikiem.

Ciekawy problem:
Przyjmijmy, że liczba zielonych pól wynosi Omega(n). Czy istnieje algorytm rozwiązujący gry w zielone działający w czasie o(n cdot m)? W szczególności, czy istnieje algorytm rozwiązujący gry w zielone działający w czasie O(m)?

Testy

Ocena rozwiązań zadania ``Gra w zielone'', przedstawionych przez uczestników olimpiady, została oparta na zachowaniu się programów na kolekcji jedenastu testów, tj. jedenastu plików wejściowych zawierających opisy plansz różnych gier w zielone:

Testy oznaczone gwiazdką zawierają dodatkowe małe fragmenty planszy zaprojektowane z myślą o weryfikacji poprawności rozwiązania.