Przeskocz do treści

Delta mi!

Informatyczny kącik olimpijski

Dwóch generałów

Tomasz Idziaszek

o artykule ...

  • Publikacja w Delcie: listopad 2013
  • Publikacja elektroniczna: 01-11-2013

W tym kąciku zajmiemy się zadaniem Dwóch generałów, które pochodzi z Uniwersyteckich Zawodów Informatycznych organizowanych przez Uniwersytet Jagielloński, a konkretnie z konkursu z października 2009 roku.

obrazek

Rys. 1 Dla powyższego planu Bitlandii, jeśli armia zaczyna w mieście 1, to generał A może przesunąć ją do miasta 3, 4 lub 5. Niezależnie od jego wyboru generałowi B pozostaje jedyny ruch do miasta 2. Generał A rusza wtedy do jeszcze nieodwiedzonego miasta ze zbioru math i wygrywa. Jeśli armia zaczyna w mieście 3, to wygra generał B.

Rys. 1 Dla powyższego planu Bitlandii, jeśli armia zaczyna w mieście 1, to generał A może przesunąć ją do miasta 3, 4 lub 5. Niezależnie od jego wyboru generałowi B pozostaje jedyny ruch do miasta 2. Generał A rusza wtedy do jeszcze nieodwiedzonego miasta ze zbioru math i wygrywa. Jeśli armia zaczyna w mieście 3, to wygra generał B.

Zadanie. Generałowie A i B rywalizują ze sobą, na przemian dyktując ruchy bajtockiej armii, która prowadzi kampanię wojenną w Bitlandii. W kraju tym jest math miast połączonych między sobą dwukierunkowymi drogami. Ruch armii polega na przesunięciu jej z miasta, w którym stacjonuje, wzdłuż drogi, do jednego z miast sąsiednich. Każde miasto, w którym znajdzie się armia, zostaje złupione i spalone – nie można go więc odwiedzić ponownie. Jeśli generał nie będzie mógł wykonać ruchu, to ośmieszy się przed armią i przegra rywalizację. Dla każdej początkowej pozycji armii należy rozstrzygnąć, który z generałów wygra, zakładając, że generał A zaczyna i że obaj generałowie grają optymalnie (patrz Rys. 1).

Plan Bitlandii możemy traktować jako graf nieskierowany math  o  math wierzchołkach i  math  krawędziach. Na początek spróbujmy rozwiązać prostszą wersję tego zadania, w której graf math  jest dwudzielny (wierzchołki reprezentujące miasta możemy podzielić na dwa zbiory math  tak, że każda krawędź-droga łączy wierzchołki znajdujące się w różnych zbiorach). Niech miasto początkowe będzie w  math  W tej sytuacji ruch generała A zawsze prowadzi z  math  do math  zaś ruch generała B – przeciwnie. Rozważmy pewną rozgrywkę między generałami, w której zwycięża generał A oraz wszystkie miasta Bitlandii zostały odwiedzone. W rozgrywce tej dla każdego miasta math  generał A wybrał pewne miasto math do którego ruszył się z  math Z warunków zadania wynika, że funkcja math jest bijekcją. Ponadto, zbiór krawędzi, którymi poruszał się generał A, jest doskonałym skojarzeniem w grafie math

Zauważmy więc, że jeśli w grafie math  istnieje doskonałe skojarzenie math  to generał A wygrywa, startując z dowolnego miasta, a jego strategia polega na poruszaniu się po krawędziach ze skojarzenia math  Generał B nigdy nie będzie mógł zrobić ruchu krawędzią z  math

obrazek

Rys. 2 Ilustracja przypadku dla math Krawędzie należące do math są pogrubione.

Rys. 2 Ilustracja przypadku dla math Krawędzie należące do math są pogrubione.

No dobrze, ale co w przypadku, gdy w  math  nie istnieje doskonałe skojarzenie? Niech math  będzie pewnym najliczniejszym skojarzeniem w  math  zaś math  będzie wierzchołkiem początkowym, który nie jest skojarzony w  math  Zauważmy, że jakikolwiek ruch generała A musi prowadzić do wierzchołka math który jest skojarzony w  math  inaczej bowiem moglibyśmy powiększyć math  dokładając do niego krawędź math Generał B może wtedy odpowiedzieć ruchem wzdłuż krawędzi z  math  Okazuje się, że będzie mógł tak zrobić zawsze. Załóżmy bowiem, że w  math-tym ruchu generał B trafia na nieskojarzony wierzchołek, czyli math jest ciągiem odwiedzonych wierzchołków, math  wtedy gdy math jest parzyste, oraz math i  math są nieskojarzone w  math (Rys. 2). Wówczas możemy usunąć ze skojarzenia math krawędzi math dla math parzystego, a zamiast tego dołożyć math krawędzi math dla math nieparzystego, co daje skojarzenie liczniejsze niż math – sprzeczność. Wynika z tego, że jeśli w grafie math  pewne najliczniejsze skojarzenie nie kojarzy wierzchołka początkowego, to skojarzenie to wyznacza strategię wygrywającą dla generała B.

Pozostał do rozważenia przypadek, w którym wierzchołek początkowy math jest skojarzony w każdym najliczniejszym skojarzeniu. Niech math  będzie pewnym takim skojarzeniem. Pokażemy, że wygrywa generał A, a jego strategią jest poruszanie się wzdłuż krawędzi skojarzenia math  Argument jest podobny jak poprzednio: gdyby w pewnym momencie dla ciągu odwiedzonych wierzchołków math wierzchołek math był nieskojarzony w  math  to wymieniając math krawędzi math dla math nieparzystego na math krawędzi math dla math parzystego, dostajemy nowe skojarzenie (równoliczne z  math  a więc o największej liczności), które nie kojarzy wierzchołka math Znów dochodzimy do sprzeczności.

Wystarczy zatem dla każdego wierzchołka math sprawdzić, czy każde najliczniejsze skojarzenie kojarzy ten wierzchołek. Dowolne najliczniejsze skojarzenie math  możemy wyznaczyć np. w czasie math  poprzez math-krotne wyszukanie ścieżki powiększającej. Wierzchołek math jest kojarzony w każdym najliczniejszym skojarzeniu, jeśli jest skojarzony w  math  oraz, po usunięciu math z grafu, liczność najliczniejszego skojarzenia się zmniejsza. Zauważmy, że szukając skojarzenia, nie musimy zaczynać zawsze od nowa, wystarczy w skojarzeniu math  usunąć krawędź kojarzącą math oraz poszukać jednej ścieżki powiększającej. Zatem cały algorytm działa w czasie math

W tym momencie Czytelnik może pokręcić z powątpiewaniem głową, że, owszem, zrobiliśmy rozgrzewkę i rozwiązaliśmy zadanie dla grafów dwudzielnych – ale jak nasze rozważania mają się do rozwiązania dla grafów dowolnych? I będzie miał słuszność, gdyż w istocie wiele problemów, które umiemy sprawnie rozwiązać dla grafów dwudzielnych, staje się trudne dla grafów niemających tej własności. Zachęcam jednak Czytelnika do przeczytania jeszcze raz powyższego rozwiązania i przekonania się, że tak naprawdę nigdzie nie korzystamy z założenia, że graf math  jest dwudzielny. Zatem nasze rozwiązanie działa również w ogólnym przypadku, pod warunkiem że umiemy znajdować najliczniejsze skojarzenia w dowolnych grafach. Można to zrobić w czasie math  algorytmem Edmondsa i w takim też czasie działa całe rozwiązanie.