Przeskocz do treści

Delta mi!

Odtwarzanie grafu

Jakub Radoszewski

o artykule ...

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

W grafie nieskierowanym możemy obliczyć stopień każdego wierzchołka, czyli liczbę krawędzi incydentnych z tym wierzchołkiem. Przykładowo, dla grafu-koperty otrzymujemy w ten sposób ciąg stopni 4, 4, 3, 3, 2. Wykonanie takiego przekształcenia dla danego grafu jest naprawdę proste. Możemy jednak postawić pytanie odwrotne: czy mając dany ciąg liczb, możemy stwierdzić, czy odpowiada on stopniom wierzchołków jakiegoś grafu nieskierowanego, a jeśli tak, zrekonstruować ten graf?

obrazek

Rys. 1

Rys. 1

obrazek

Rys. 2

Rys. 2

Weźmy, na przykład, ciąg 4, 4, 3, 3, 1 – czy jest on ciągiem stopni jakiegoś grafu? Tutaj łatwo udzielić odpowiedzi negatywnej. Faktycznie, każda krawędź w grafie wpływa na zwiększenie stopni dwóch wierzchołków o jeden, czyli suma stopni musi zawsze być parzysta. A teraz coś bardziej skomplikowanego: ciąg 4, 4, 3, 2, 1. Jeśli dopuszczamy krawędzie wielokrotne, graf możemy odtworzyć, na przykład, tak jak na rysunku 2. To jest jednak multigraf – w „zwykłym” grafie nie możemy mieć krawędzi wielokrotnych ani pętli. Po chwili kombinowania można sprawdzić, że podany ciąg nie odpowiada żadnemu zwykłemu grafowi. Przydałby się jakiś uniwersalny przepis na takie sprawdzanie.

Na szczęście taki przepis – algorytm – istnieje. Jest on przykładem podejścia zachłannego: wybieramy dowolny wierzchołek grafu, czyli element ciągu stopni, po czym łączymy go krawędziami z wierzchołkami o możliwie najwyższych stopniach. Następnie zmniejszamy stopnie tych wierzchołków, usuwamy wybrany wierzchołek z grafu i powtarzamy to samo od początku. Jeśli w pewnym momencie nie uda się znaleźć odpowiedniej liczby wierzchołków o dodatnich stopniach, kończymy algorytm z wynikiem negatywnym. Rozważmy, dla przykładu, początkowy ciąg 4, 4, 3, 3, 2. Wybieramy wierzchołek o stopniu 3 i łączymy go z wierzchołkami o stopniach 4, 4, 3. Nowy ciąg to 3, 3, 2, 2. Wybierzmy ponownie wierzchołek o stopniu 3; łączymy go ze wszystkimi pozostałymi i otrzymujemy ciąg 2, 1, 1. Jeśli teraz ponownie wybierzemy wierzchołek o najwyższym stopniu, to uda nam się skonstruować cały graf, dokładnie taki jak na rysunku 1. Gdybyśmy natomiast zaczęli od ciągu 4, 4, 3, 2, 1 i wybrali kolejno pierwsze dwa wierzchołki (te o początkowym stopniu 4), już w drugim kroku – ciąg 3, 2, 1, 0 – otrzymalibyśmy odpowiedź negatywną.

Wykażemy, że ta metoda, znana też pod nazwą algorytmu Havla–Hakimiego, zawsze daje poprawne wyniki. W tym celu wystarczy udowodnić, że jeśli dla danego ciągu liczb istnieje graf, dla którego rozważany ciąg jest ciągiem stopni wierzchołków, to nasz algorytm taki graf znajdzie. Załóżmy, przez zaprzeczenie, że nierosnący ciąg math odpowiada stopniom wierzchołków pewnego grafu math  ale nasz algorytm uruchomiony dla ciągu math zwrócił odpowiedź negatywną. Niech math będzie stopniem pierwszego wierzchołka rozważanego w algorytmie; nazwijmy ten wierzchołek math W naszym algorytmie próbujemy połączyć wierzchołek math z wierzchołkami o stopniach math (z pominięciem samego math rzecz jasna). Skoro graf math  istnieje, to na pewno dla wierzchołka math musi nam się to udać.

obrazek

Rys. 3 Podmiana krawędzi math  i math  na math  i math

Rys. 3 Podmiana krawędzi math  i math  na math  i math

Spytajmy zatem, z jakimi wierzchołkami w math  jest połączony wierzchołek math Jeśli z tymi samymi co w naszym algorytmie, to możemy usunąć wierzchołek math wraz z tymi połączeniami i rozumować indukcyjnie dla ciągu o jeden wierzchołek krótszego. Załóżmy więc, że tak nie jest: niech math będzie wierzchołkiem o największym możliwym stopniu math który nie jest połączony z math w grafie math  Wierzchołek math  musi być zatem połączony w math z jakimś innym wierzchołkiem, powiedzmy math  o stopniu math dla math Pokażemy, że możemy w math  tak pozamieniać krawędzie, żeby wierzchołek math był połączony z math zamiast z math  (patrz rysunek 3). Faktycznie, ponieważ math więc w math  musi istnieć jakiś wierzchołek (nazwijmy go math) połączony z math i niepołączony z math  Podmieniając w grafie math  krawędzie math  i math na krawędzie math i math  otrzymujemy dokładnie to, czego chcieliśmy. Jeśli po wykonaniu tej operacji zbiór sąsiadów math w math  wciąż nie jest tej samej postaci co w naszym algorytmie, kontynuujemy tego typu podmiany aż do chwili, kiedy te zbiory sąsiadów będą takie same. Po tym usuwamy z grafu math  wierzchołek math  wraz z incydentnymi krawędziami i powtarzamy wcześniejsze rozumowanie na tak zmniejszonym grafie. Widać, że na końcu otrzymamy dokładnie taki graf, jaki skonstruowałby nasz algorytm.

Wtręt implementacyjny:
Podany algorytm można zaimplementować w czasie kwadratowym ze względu na liczbę wierzchołków grafu, czyli math  Wystarczy w metodzie zachłannej za każdym razem wybierać wierzchołek o największym stopniu, czyli odpowiadający elementowi math Wówczas obsłużenie tego wierzchołka polega na zmniejszeniu elementów math o jeden, usunięciu elementu math z ciągu i poprawieniu uporządkowania ciągu. Wszystko to można zrobić w czasie math przy czym najmniej oczywistą fazę – przywracanie porządku nierosnącego – wykonujemy za pomocą co najwyżej jednego odwrócenia fragmentu ciągu, patrz też rysunek 4.

Przy nieco ostrożniejszej implementacji można zapisać ten algorytm w złożoności czasowej proporcjonalnej do sumy elementów ciągu math czyli w czasie proporcjonalnym do liczby krawędzi konstruowanego grafu. Jak to zrobić?

obrazek

Rys. 4 Pierwszy krok algorytmu zachłannego wykonywany dla ciągu 5, 5, 4, 4, 4, 4, 4, 4, 2, 2, 1.

Rys. 4 Pierwszy krok algorytmu zachłannego wykonywany dla ciągu 5, 5, 4, 4, 4, 4, 4, 4, 2, 2, 1.

Jeśli jesteśmy zainteresowani tylko binarną informacją – czy podany ciąg jest ciągiem stopni wierzchołków jakiegoś grafu (czy ciąg jest graficzny) – możemy posłużyć się jeszcze prostszym kryterium. Pochodzi ono od Erdősa i Gallaiego (w skrócie EG) i orzeka, że nierosnący ciąg math o parzystej sumie jest graficzny wtedy i tylko wtedy, gdy dla każdego math zachodzi nierówność

display-math

Aby zrozumieć sens nierówności EG, pokażemy, że stanowią one warunek konieczny na graficzność ciągu math Ustalmy parametr math Wówczas po lewej stronie nierówności mamy „zapotrzebowanie na krawędzie” pierwszych math wierzchołków. Owo zapotrzebowanie może zostać zaspokojone przez krawędzie łączące pewne pary tych wierzchołków – takich krawędzi może być co najwyżej math a każda z nich ma wpływ na stopnie dwóch spośród rozważanych wierzchołków – oraz przez krawędzie łączące pewne z tych wierzchołków z pozostałymi. Wierzchołek o stopniu math  math dostarcza co najwyżej math takich krawędzi – po jednej do każdego z wierzchołków math – a zarazem, oczywiście, co najwyżej math krawędzi, skąd otrzymujemy konieczność nierówności EG.

Z kolei dostateczność warunków EG można próbować pokazać, wykorzystując własności algorytmu zachłannego. Przykładowo, polecamy Czytelnikowi pouczające sprawdzenie, że pierwsze dwie nierówności EG są równoważne temu, iż algorytm zachłanny poprawnie przetworzy kolejno wierzchołki o stopniach math i math Pełny dowód dostateczności kryterium EG jest, niestety, bardziej skomplikowany.


Wtręt implementacyjny:
Kryterium EG ma także tę przewagę nad algorytmem Havla–Hakimiego, że jego prawdziwość można sprawdzić w czasie liniowym względem liczby wierzchołków grafu. Łatwo zauważyć, że wszystkie sumy prefiksowe i sufiksowe ciągu math:

display-math

można obliczyć w czasie math  Wtedy lewa strona math-tej nierówności EG to dokładnie math Z kolei trochę nietypowe sumy występujące po prawej stronie nierówności można łatwo obliczyć, jeśli znamy liczbę elementów ciągu math większych niż math (oznaczenie: math). Wówczas suma po prawej stronie to math jeśli math natomiast w przeciwnym przypadku jest ona równa math Wreszcie ciąg math możemy wyznaczyć w czasie math i to na kilka różnych sposobów.

Warto na koniec wspomnieć o jeszcze jednym kryterium graficzności ciągu. Nie jest ono efektywniejsze ani bardziej praktyczne od kryterium EG, ale za to wygląda bardziej egzotycznie. Załóżmy, że math w przeciwnym przypadku mamy natychmiast odpowiedź negatywną. Rozważmy macierz zero-jedynkową math  wymiaru math o zerowej przekątnej, w której math-ty wiersz zawiera math jedynek dopchniętych do lewej strony – z uwzględnieniem jednak zerowej przekątnej. Niech math będzie ciągiem sum w kolumnach macierzy math  Wówczas kryterium Gale’a–Rysera orzeka, że ciąg math jest graficzny wtedy i tylko wtedy, gdy sumy prefiksowe ciągu math są zdominowane przez sumy prefiksowe ciągu math tzn.

display-math

Wnikliwemu Czytelnikowi pozostawiamy podanie związku między tym kryterium a warunkami EG.

Na koniec kilka pytań do Czytelnika. Jakie warunki musi spełniać ciąg stopni math żeby dało się z niego odtworzyć graf, który jest spójny? A jakie, żeby odpowiadał stopniom wierzchołków jakiegoś grafu dwudzielnego? No dobrze, to drugie zadanie jest dosyć trudne. Ale jakie warunki musi spełniać para ciągów math i math tak aby istniał graf dwudzielny, w którym math odpowiada stopniom wierzchołków z jednej grupy, a math – wierzchołkom z drugiej grupy?