Przeskocz do treści

Delta mi!

Informatyczny kącik olimpijski

Drogi

Jakub Radoszewski

o artykule ...

  • Publikacja w Delcie: wrzesień 2012
  • Publikacja elektroniczna: 03-09-2012

W tej edycji kącika znowu cofniemy się w czasie do 2005 roku, do pierwszej edycji konkursu Potyczki Algorytmiczne, i omówimy zadanie z finału próbnego tego konkursu pt. Drogi (bardzo podobne zadanie pojawiło się zresztą w jeszcze bardziej zamierzchłej przeszłości, na Międzynarodowej Olimpiadzie Informatycznej w 1996 roku).

Treść zadania jest bardzo prosta:

Zadanie. Do danego grafu skierowanego chcielibyśmy dołożyć możliwie najmniej krawędzi (skierowanych, rzecz jasna), tak by po tej operacji z każdego wierzchołka grafu dało się dojść do każdego innego wierzchołka. Innymi słowy, chcemy spowodować, żeby dany graf stał się silnie spójny.

Przy tak sformułowanym problemie naturalny wydaje się pomysł, aby dany graf (oznaczmy go przez math  ) podzielić na silnie spójne składowe, tym bardziej że tę operację możemy wykonać w czasie liniowym względem rozmiaru grafu. Warto od razu pójść o krok dalej i przyjrzeć się grafowi silnie spójnych składowych math  grafu math  w którym każdej silnie spójnej składowej grafu math  odpowiada jeden wierzchołek, a krawędź między danymi dwoma wierzchołkami w  math  istnieje, gdy odpowiadające im składowe w  math  były połączone co najmniej jedną krawędzią. Graf math  jest, oczywiście, acykliczny. Ponieważ w grafie math nie opłaca się nigdy dodawać krawędzi w ramach tej samej silnie spójnej składowej, więc wynik dla grafu math  jest taki sam jak dla grafu math  Odtąd będziemy zajmować się już tylko grafem math

obrazek

Rys. 1 Przykład grafu math  Mamy math

Rys. 1 Przykład grafu math  Mamy math

Po krótkim przyjrzeniu się grafowi math  łatwo dostrzec pewne dolne ograniczenie na liczbę krawędzi, które trzeba dodać. Oznaczmy przez math liczbę wierzchołków grafu math  do których nie wchodzi żadna krawędź, podobnie przez math oznaczmy liczbę tych wierzchołków, z których nie wychodzi żadna krawędź (patrz Rys. 1). Wspomnianym ograniczeniem dolnym jest liczba math Faktycznie, aby z każdego wierzchołka grafu math  mogło się dać na końcu odwiedzić wszystkie pozostałe wierzchołki grafu, z każdego wierzchołka musi wychodzić jakaś krawędź; podobnie, do każdego wierzchołka musi wchodzić jakaś krawędź. Jest tylko jeden wyjątek: jeśli graf math  ma dokładnie jeden wierzchołek, to math od początku był silnie spójny, więc nie musimy dodawać do niego żadnych krawędzi.

Przeanalizowanie kilku prostych przykładów pozwala dojść do przeświadczenia, że aby graf acykliczny uczynić silnie spójnym, zawsze wystarczy dodać math krawędzi. To pozwala zgadnąć, że nasze dolne ograniczenie jest zarazem ograniczeniem górnym, co wystarcza do wyznaczenia liczby potrzebnych krawędzi. My postawimy sobie ambitniejszy cel i spróbujemy udowodnić nasze spostrzeżenie.

obrazek

Rys. 2 Graf math  odpowiadający grafowi math  z rysunku 1.

Rys. 2 Graf math  odpowiadający grafowi math  z rysunku 1.

Skoro interesuje nas jedynie math  „dolnych” i  math  „górnych” wierzchołków grafu math to stworzymy graf dwudzielny math  zawierający tylko te wierzchołki. Wierzchołki math i  math będą w grafie math  połączone krawędzią, jeśli w  math  istniała między nimi jakaś ścieżka (Rys. 2). Wynik, jaki otrzymamy dla math  będzie oczywiście taki sam jak wynik dla math  Załóżmy na razie, że graf math  a więc też graf math  nie zawiera wierzchołków izolowanych.

Pojawienie się grafu dwudzielnego naturalnie podsuwa pomysł, żeby w tym grafie znaleźć maksymalne skojarzenie (jak się dalej okaże, nie potrzebujemy wcale najliczniejszego skojarzenia, wystarczy nam dowolne maksymalne).

obrazek

Rys. 3 Konstrukcja rozwiązania dla grafu math  z rysunku 2. Pogrubione krawędzie biegnące w górę to maksymalne skojarzenie w grafie math

Rys. 3 Konstrukcja rozwiązania dla grafu math  z rysunku 2. Pogrubione krawędzie biegnące w górę to maksymalne skojarzenie w grafie math

Jeśli graf math  zawiera skojarzenie rozmiaru math  to wszystkie wierzchołki skojarzone – math  dolnych i  math  górnych – możemy połączyć w cykl za pomocą math  krawędzi poprowadzonych „na zakładkę”. To stanowi dobrą bazę do konstrukcji całego rozwiązania. Musimy jeszcze tylko w jakiś sposób dołączyć do tego cyklu nieskojarzone wierzchołki. Możemy to zrobić następująco: math  wierzchołków nieskojarzonych łączymy w pary krawędziami biegnącymi w dół, a pozostałe wierzchołki nieskojarzone (znajdujące się już tylko z jednej strony grafu) dołączamy krawędziami bezpośrednio do cyklu – w przypadku wierzchołków górnych używamy krawędzi skierowanych ku cyklowi, a w przeciwnym razie używamy krawędzi skierowanych od cyklu (Rys. 3).

Spróbujmy uzasadnić poprawność tej konstrukcji. Przyjęliśmy, że w grafie nie ma wierzchołków izolowanych, więc każdy górny nieskojarzony wierzchołek jest połączony w  math  z jakimś dolnym wierzchołkiem skojarzonym (nie mógłby to być dolny wierzchołek nieskojarzony, gdyż wtedy moglibyśmy powiększyć skojarzenie). Symetryczne stwierdzenie zachodzi też dla dolnych wierzchołków nieskojarzonych. To oznacza, że z cyklu da się dojść do każdego z górnych wierzchołków nieskojarzonych, podobnie z każdego z dolnych wierzchołków nieskojarzonych da się dojść do cyklu. Teraz już łatwo sprawdzamy, że po dodaniu krawędzi biegnących w dół (oraz tych łączących wierzchołki nieskojarzone bezpośrednio z cyklem) graf math  jest silnie spójny.

Na koniec warto przypomnieć sobie o wierzchołkach izolowanych w  math Ponieważ wliczają się one tak do dolnej, jak i do górnej grupy w grafie math  więc możemy je rozpatrzyć zupełnie osobno: najpierw znaleźć rozwiązanie dla grafu bez tych wierzchołków, a następnie umieścić je kolejno wewnątrz dowolnej z dodanych przez nas krawędzi. Trzeba też dodatkowo rozpatrzyć przypadek szczególny, gdy w grafie math były same wierzchołki izolowane – wtedy po prostu łączymy je wszystkie w cykl.