Informatyczny kącik olimpijski
Drogi
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 ) 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 grafu w którym każdej silnie spójnej składowej grafu odpowiada jeden wierzchołek, a krawędź między danymi dwoma wierzchołkami w istnieje, gdy odpowiadające im składowe w były połączone co najmniej jedną krawędzią. Graf jest, oczywiście, acykliczny. Ponieważ w grafie nie opłaca się nigdy dodawać krawędzi w ramach tej samej silnie spójnej składowej, więc wynik dla grafu jest taki sam jak dla grafu Odtąd będziemy zajmować się już tylko grafem
Po krótkim przyjrzeniu się grafowi łatwo dostrzec pewne dolne ograniczenie na liczbę krawędzi, które trzeba dodać. Oznaczmy przez liczbę wierzchołków grafu do których nie wchodzi żadna krawędź, podobnie przez oznaczmy liczbę tych wierzchołków, z których nie wychodzi żadna krawędź (patrz Rys. 1). Wspomnianym ograniczeniem dolnym jest liczba Faktycznie, aby z każdego wierzchołka grafu 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 ma dokładnie jeden wierzchołek, to 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ć 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.
Skoro interesuje nas jedynie „dolnych” i „górnych” wierzchołków grafu to stworzymy graf dwudzielny zawierający tylko te wierzchołki. Wierzchołki i będą w grafie połączone krawędzią, jeśli w istniała między nimi jakaś ścieżka (Rys. 2). Wynik, jaki otrzymamy dla będzie oczywiście taki sam jak wynik dla Załóżmy na razie, że graf a więc też graf 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).
Jeśli graf zawiera skojarzenie rozmiaru to wszystkie wierzchołki skojarzone – dolnych i górnych – możemy połączyć w cykl za pomocą 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: 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 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 jest silnie spójny.
Na koniec warto przypomnieć sobie o wierzchołkach izolowanych w Ponieważ wliczają się one tak do dolnej, jak i do górnej grupy w grafie 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 były same wierzchołki izolowane – wtedy po prostu łączymy je wszystkie w cykl.