Kombinatoryka dla programistów Wydanie drugie
U^ff " ¥
Wydawnictwa Naukowo-Techniczne Warszawa 1989
WITOLD LIPSKI
© Copyright by Wydawnictwa Naukowo-Techniczne, Warszawa 1982, 1989 Ali rights reserved Printed in Poland
ISBN
83-204-1023-1
English summary, sce p. 181
K o m b i n a t o r y k a dla programistów Combioatorics for Programmers PyccKOC pe3K>Me, CM. crp. 182
KOMÓHHaTOpMKa
ĄSUl
nporpaMMHCTOB
W książce przedstawiono wybrane zagadnienia kombinatoryki, teorii grafów i algorytmów kombinatorycznych. Szczególny nacisk położono na algorytmiczne podejście do problemów kombinatorycznych. Rozważanym problemom towarzyszą zwykle szczegółowe algorytmy ich rozwiązania i analiza złożoności obliczeniowej tych algorytmów. Algorytmy zamieszczone w pracy to nieco skondensowane nieformalne wersje programów napisanych w Pascalu. Każdy z rozdziałów zawiera na końcu zbiór zadań. Książka jest przeznaczona dla programistów, projektantów systemów przetwarzania informacji, pracowników nauki zajmujących się informatyką oraz dla studentów kierunków informatycznych. 519:681.3
11^ Redaktor wydania pierwszego KRYSTYNA REGULSKA
Okładkę i układ typograficzny serii projektował TADEUSZ PIETRZYK
Tytuł dotowany przez Ministra Edukacji Narodowej
Redaktor techniczny KRYSTYNA ORŁOŚ
[pis treści
Od Autora d o wydania pierwszego
7
1
Wprowadzenie d o kombinatoryki
9
1.1 i;2 1.3 1.4 1.5 1.6 1.7 1.8 1.9 1.10 1.11 1.12 1.13 1.14
Pojęcia wstępne Funkcje i rozmieszczenia Permutacje: rozkład na cykle, znak permutacji Generowanie permutacji Podzbiory zbioru, zbiory z powtórzeniami, generowanie podzbiorów zbioru Podzbiory fc-elementowe, współczynnik dwumienny Generowanie podzbiorów ^-elementowych Podziały zbioru Liczby Stirlinga drugiego i pierwszego rodzaju Generowanie podziałów zbioru Podziały liczby Funkcje tworzące Zasada włączania-wyłączania Zadania
30 35 39 42 44 48 52 56 63 67
Z
Algorytmy grafowe
74
2.1 2.2 2.3 2.4 2.5 2.6 2.7 2.8 2-9
Reprezentacja maszynowa grafu Przeszukiwanie grafu w głąb Przeszukiwanie grafu wszerz Drzewa rozpinające Znajdowanie fundamentalnego zbioru cykli w grafie Znajdowanie składowych dwuspójnych Drogi Eulera Algorytmy z powracaniem Zadania
74 78 81 83 86 89 93 95 100
5
Znajdowanie najkrótszych dróg w grafie
104
'•1 'Ą k#
Pojęcia wstępne Najkrótsze drogi z ustalonego wierzchołka Przypadek nieujemnych wag — algorytm Dijkstry
9 13 16 21
104 106 108
3.4 3.5 3.6
Drogi w grafie acyklicznym Najkrótsze drogi między wszystkimi parami wierzchołków, domknię cie przechodnie relacji Zadania
111 114 117
4
Przepływy w sieciach i zagadnienia pokrewne
120
4.1 4.2 4.3 4.4 4.5 4.6
Maksymalny przepływ w sieci Algorytm znajdowania maksymalnego przepływu Skojarzenia o maksymalnej liczności w grafach dwudzielnych . . . Systemy różnych reprezentantów Rozkład na łańcuchy Zadania
120 125 136 144 151 156
5
Matroidy
160
5.1 5.2 5.3 5.4 5.5 5.6 5.7
Algorytmy zachłanne rozwiązywania problemów optymalizycyjnych Matroidy i ich podstawowe własności Twierdzenie Rado-Edmondsa Matroidy macierzowe Matroidy grafowe Matroidy transwersalne Zadania
160 161 166 168 170 173 176
Literatura
178
Autora do wydania pierwszego
f—f Ann byłoby chyba wymienić dział informatyki teoretycznej, w którym w cią« f ostatniego dziesięciolecia poczyniono by większe postępy niż w projektowanjgl i analizie algorytmów kombinatorycznych. Z jednej strony znaleziono wiele mipjjjf li efektywniejszych metod rozwiązywania problemów kombinatorycznych 2%pomocą komputerów, z drugiej zaś uzyskano wyniki teoretyczne świadczące coraz wyraźniej o nieistnieniu „rozsądnie efektywnych" algorytmów dla szerokiej Icfauy zagadnień. Efektywne algorytmy kombinatoryczne znajdują zastosowania w wielu dziedzinach nienumerycznego przetwarzania informacji, zwłaszcza w op tymalizacji dyskretnej i badaniach operacyjnych. W pracy przedstawiono wybrane działy kombinatoryki, szczególny nacisk kładąc na konstruktywne, algorytmiczne podejście — omawianym problemom koaabinatorycznym towarzyszą z reguły algorytmy ich rozwiązywania wraz z aaąłizą ich złożoności obliczeniowej. Algorytmy te są nieco skondensowanymi tMMggami programów uruchomionych w języku Pascal. N a wybór omawianych zaąpdjpeń — w dużej mierze wyrywkowy, ze względu n a założoną objętość pracy z JKłttqi strony i obszerność dziedziny z drugiej — wpłynęły zarówno zaintereso wania autora, jak i chęć dopełnienia raczej niż dublowania dwóch innych książek o pokrewnej tematyce wydanych w serii Biblioteki Inżynierii Oprogramowania (PQB. [2]) oraz w serii Informatyka (poz. [76]).* {.^JPierwszy, najobszerniejszy rozdział zawiera wykład najbardziej klasycznych d^ljów kombinatoryki (permutacje, podziały zbioru i liczby, współczynnik my, funkcje tworzące itp.) wraz z wieloma — niekoniecznie klasycz— algorytmami generowania omawianych obiektów kombinatorycznych. Włziale 2 przedstawiono podstawowe techniki używane przy projektowaniu *W*ytaiów grafowych, w szczególności metody systematycznego przeszukiwania Tematyka związana z grafami jest kontynuowana przez dwa następne w pierwszym z nich omówiono metody znajdowania najkrótszych r.W grafach, których krawędziom przypisano dowolne „długości", w drugim itrowano się na problemie znajdowania maksymalnego przepływu w sieci * Zob. także L. Banachowski, A. Kreczmar, W. Rytter: Analiza algorytmów i struktur ft. Wyd. 1. Warszawa, WNT 1987 (wznowienie w druku). — Przyp. red. do wyd. 2.
OD AUTORA DO WYDANIA PIERWSZEGO
(tzn. w grafie o określonych „przepustowościach" krawędzi). W ostatnim roz dziale omówiono zastosowanie kombinatorycznego pojęcia matroidu do rozwią zywania pewnej klasy zagadnień optymalizacyjnych. Książka jest przeznaczona dla programistów pragnących wzbogacić swą wiedzę na temat algorytmów kombinatorycznych oraz podbudować teoretycznie swą wiedzę praktyczną. Od Czytelnika wymaga się jedynie elementarnych wia domości z matematyki, znajomości języka programowania Pascal (p. poz. [36] i [75]) oraz pewnego doświadczenia w programowaniu w języku wyższego poziomu. Pragnę podziękować doc. dr. hab. Wiktorowi Markowi za wiele cennych uwag, które pozwoliły usunąć usterki z pierwotnej wersji tej książki.
Warszawa, w grudniu 1980
WITOLD
LIPSKI
Wprowadzenie do kombinatoryki
Pojęcia wstępne W punkcie tym są zebrane podstawowe definicje i oznaczenia dotyczące używa nych pojęć logicznych i teoriomnogościowych oraz przedstawionych w dalszym ciągu algorytmów. Zaczniemy od pojęć logicznych i teoriomnogościowych (Czytelnika zainte resowanego w głębszym poznaniu tych pojęć odsyłamy do pozycji [49] i [57]). Używać będziemy spójników logicznych v (lub), A (i), ~t (nie), => ( j e ś l i t o . . . ) , o (wtedy i tylko wtedy, gdy). Fakt, że x jest elementem zbioru X zapisujemy j a k o xe X, jego zaprzeczenie przez x $ X. Zbiór tych elementów zbioru X, które spełniają warunek oznaczamy przez {x e X: y dla y < x, x < y dla x < y A X ^ y itp. Przykładem zbioru częściowo uporząd kowanego jest zbiór liczb całkowitych z relacją podzielności, zbiór liczb całko witych (lub rzeczywistych) ze zwykłą relacją mniejszości lub równości „ < " , j a k również zbiór 0* (X) z relacją zawierania £ . Jeśli funkcja (odwzorowanie) / przyporządkowuje każdemu wi x e X e l e m e n t / ( x ) e Y, t o p i s z e m y / : X -* Y (funkcję taką możemy j a k o relację R £ Xx Yo tej własności, że dla każdego x e Xistnieje w R jedna p a r a postaci <x, j > , yeY; dla naszych celów wystarczy jednak pojęcie funkcji). Dla dowolnych A £ X, B £ Y definiujemy / (A) = {yeY:
istnieje x e A, takie że y = f (x)}
f~\B)
{xeX:f(x)eB}
=
elemento traktować dokładnie intuicyjne
- 1
(zamiast /~'({&}) piszemy p o prostu / ( ^ ) ) Jeśli f(X) = Y, to mówimy o funkcji z X na Y. Funkcja f:X-* Y jest równowar tościowa (wzajemnie jednoznaczna), jeśli dla dowolnych a,beX a *b=>f(a)
*/(&)
Pojęciem często przez nas używanym będzie pojęcie grafu (por. [ 9 ] , [31]). Przez graf niezorientowany (lub k r ó t k o : graf) rozumiemy dowolną parę G = = (V,E~), taką że E
£
{ { M , V}:
U,V
eV
A
U ^
v}
Grafem zorientowanym nazywamy dowolną parę G = < V, £ > , taką że £ £ £ VxV. W obu przypadkach zbiory V i E nazywamy odpowiednio zbiorem wierzchołków i zbiorem krawędzi grafu G. Graf reprezentujemy zwykle na płaszczyźnie w postaci zbioru punktów odpowiadających wierzchołkom i łączących je linii odpowiadających krawędziom. Linia odpowiadająca krawędzi {u,v} lub > łączy punkty odpowiadające wierzchołkom u, v, przy czym w tym drugim przypadku jest zaopatrzona w strzałkę określającą kierunek z u d o v (rys. 1.1). W kontekście ustalonego grafu G = < F , £ > będziemy często używać ozna czeń w— v, u -* v zamiast odpowiednio {u, v} e E i <w, u> e E. Jeśli krawędź e jest postaci {u, v} lub <w, vy, to mówimy, że krawędź e jest incydentna z wierz chołkami u i v, oraz że wierzchołki u i sąsiadują ze sobą. Stopień wierzchołka określamy j a k o liczbę krawędzi incydentnych z nim. Wierzchołek stopnia 0 nazywamy izolowanym (np. wierzchołek v na rys. 1.1 a). Drogą w grafie G = = 0 i i^ — v (lub u, -» » , jeśli G jest grafem zorientowanym), i = 1 , f c —1. Wierzchoł5
0
ł + 1
lt
k
l + 1
Vi i v nazywamy odpowiednio początkiem i końcem drogi, liczbę k natomiast jej długością. Drogę, której początek pokrywa się z końcem, nazywamy cyklem. Jeśli wszystkie wierzchołki drogi v ...,v są różne, to mówimy o drodze ele mentarnej. Podobnie, cykl v\, v (v = v ) nazywamy elementarnym, jeśli •wierzchołki v są różne. Podgrafem grafu (7 = < F , £ > nazywamy d o k
u
k
k
x
k
u
wolny graf G ' = < V , E'}, taki że V s F i £ ' s £ .
RYS. 1.1 (a) Graf niezorien towany (b) Graf zoriento
wany Niech G = (V, Ey będzie dowolnym grafem niezorientowanym i niech ve V. Niech A będzie zbiorem tych wierzchołków « e F, d o których istnieje droga z v. Zbiór A wraz z krawędziami grafu G, incydentnymi z wierzchołkami z A, określa pewien podgraf zwany składową spójną grafu G. Oczywiście zbiory wierzchołków składowych spójnych dowolnego grafu są parami rozłączne. N a przykład dla grafu z rysunku l . l a są t o zbiory V = {v v , v , v , v ], V — {v } i V = t
u
2
3
A
6
2
s
3
= 0>7> *>8, V , V , Vu}. Mówimy, że grafy G = < F , Ey i G' = (V, E'y są izomorficzne, jeśli istnieje wzajemnie jednoznaczne odwzorowanie / z V na V, takie że dla dowolnych a, v e V mamy {u, v}eEo { / ( « ) , /(I>)} e E' v>eEo(f (u), f (»)> e £ ' w przypadku grafów zorientowanych). Zwykle nie będziemy rozróżniać między grafami izomorficznymi. Dla dowolnej liczby rzeczywistej x będziemy używać oznaczeń lxi i lx], odpowiednio dla największej liczby całkowitej nie większej niż x i najmniejszej Hcżby całkowitej nie mniejszej od x, n p . 13.5J = 3, (3.51 = 4, l—3.5J = —4, 1-3.51 = - 3 . Przechodzimy teraz do pojęć związanych z algorytmami. Będziemy j e zwykle zapisywać w języku programowania będącym nieformalną wersją Pascala [ 3 6 ] , [ 7 5 ] . Jeśli realizacja jakiegoś fragmentu programu jest oczywista, lecz żmudna i zaciemniająca ideę algorytmu, t o fragment taki będziemy czasami zastępować .opisem w języku naturalnym. Stosujemy też nieformalne konstrukcje, takie j a k n a przykład pętle for x e Xdo P (wykonaj instrukcję P dla wszystkich elementów x ||ai>ioru X — w dowolnej kolejności), STOS . Problem nasz jest najprostszy, gdy nie nakładamy żadnych ograniczeń na rozmieszczenia. M a m y bowiem następujące twierdzenie: TWIERDZENIE
1.1
Jeśli \X\ = n, \ Y\ = m, to liczba wszystkich funkcji f:X-*
Y jest równa rrf.
DOWÓD
Przyjmując X = ( 1 , n}, sprowadzamy zagadnienie do pytania o liczbę wszy stkich ciągów < j y„} o wyrazach ze zbioru w-elementowego Y. Każdy wy raz y, możemy wybrać na m sposobów, co daje m" możliwości wyboru ciągu O-i. •• •,;>„>. 1 ;
* Zapisu symbolicznego /(n) = O (g («)) nie należy traktować jako równości; na przy kład z f{n) = O (g (n)) i h (n) = O (g («)) oczywiście nie wynika f{n) = h (n).
Łatwo również znaleźć liczbę rozmieszczeń, dla których każde pudełko zawiera co najwyżej jeden obiekt — takie rozmieszczenia odpowiadają funk cjom różnowartościowym. Oznaczamy przez [ni] liczbę wszystkich funkcji różnowartościowych ze zbioru n-elementowego w zbiór w-elementowy. H
TWIERDZENIE 1 . 2
Jeśli \X\ = n, \Y\ = m, t o liczba wszystkich funkcji różnowartościowych/: X -* Y jest r ó w n a [ w ] . = m(m-l)
... (m-n
+ 1)
(1.1)
(przyjmujemy [ m ] = 1 ) . 0
DOWÓD
Poszukujemy tym razem liczby ciągów różnowartościowych (y , ...,y„y o wy razach ze zbioru Y. Wyraz y takiego ciągu możemy wybrać na m sposobów, wyraz y na m — l sposobów, ogólnie: przy ustalonych wyrazach y możemy j a k o y wybrać dowolny spośród m — i+1 elementów zbioru Y\{y yi-i} (zakładamy n < m; jeśli n > m, t o oczywiście zarówno [m] , j a k i szukana liczba funkcji jest równa zeru). Daje t o m(m — 1 ) ... ( m — h + \ ) możliwości wyboru ciągu różnowartościowego
< 3 , 1, 2 >
< 4 , 1, 2 >
< 2 , 1, 4 >
< 3 , 1, 4 >
< 4 , 1, 3 >
Jeśli m = n, t o każda funkcja różnowartościowa f: X -* Y jest wzajemnie jednoznacznym odwzorowaniem zbioru Xxm zbiór F. W takim przypadku [n]„ = = n(n—1) ... 1 oznaczamy przez n! (n silnia). Każde wzajemnie jednoznaczne odwzorowanie f:X-+Xnazywamy permutacją zbioru X. Jako szczególny przy padek twierdzenia 1.2 otrzymujemy TWIERDZENIE
1.3
Liczba permutacji zbioru n-elementowego jest równa «!. • Permutacje rozważać będziemy w następnych punktach, teraz natomiast zajmiemy się jeszcze innym typem rozmieszczenia obiektów w pudełkach. Za łóżmy, że rozmieszczamy n obiektów w m pudełkach, przy czym każde pudełko zawiera teraz ciąg, a nie j a k poprzednio zbiór umieszczonych w nim obiektów. D w a rozmieszczenia uważamy za równe, jeśli w każdym pudełku zawierają taki sam ciąg obiektów. Rozmieszczenia tego typu będziemy nazywać rozmieszcze niami uporządkowanymi n obiektów w m pudełkach. Oznaczamy liczbę takich uporządkowań przez [ni]"-
•jTwTERDZENIE 1.4 Liczba rozmieszczeń uporządkowanych « obiektów w m pudełkach jest równa [m]" = m(m + l ) . . . ( m + n - l )
(1.2)
(przyjmujemy [ m ] ° = 1). Dowód
Będziemy konstruować rozmieszczenie uporządkowane przez kolejne dodawanie nowych obiektów. Pierwszy obiekt możemy rozmieścić n a m sposobów, drugi na m + 1 sposobów, gdyż d a się umieścić w jednym z m— 1 pustych pudełek lub w pudełku zawierającym pierwszy obiekt przed lub za tym obiektem. Ogólnie, załóżmy, że rozmieściliśmy j u ż i—l obiektów, przy czym dla k = 1,2, m w ifc-tym pudełku znajduje się r obiektów. Wtedy i-ty obiekt możemy dodać na r +l sposobów d o k-tego pudełka, co w sumie daje k
k
(r-i +
l H ... +(r +l) = (/-!+ ... m
+r )+m m
=
m+i-1
możliwości. Wszystkich rozmieszczeń uporządkowanych jest więc m(m + l)... ... ( m + n - 1 ) . • N a rysunku 1.2 przedstawiono wszystkie [ 3 ] = 12 rozmieszczeń uporząd kowanych elementów a, b w trzech-pudełkach. 2
ab ba
ab ba
r ~ ]
RYS. 1.2 Rozmieszczenia uporządkowane elementów a, b w trzech pudełkach
Odnotujmy na zakończenie następujące proste zależności: [m]„ = ( m - n + 1) [m] = B
[m]" = [
ml/n! m
+ n-l]„
{.m} .
n 1
(1.3) (1.4) (1.5)
Permutacje: rozkład na cykle, znak permutacji Przypomnijmy, że permutacją zbioru w-elementowego X nazywamy dowolną wzajemnie jednoznaczną funkcję / : X -> X. Zwykle permutacje określamy za pomocą tablicy o dwóch wierszach, z których każdy zawiera wszystkie elementy zbioru X, przy czym element f(x) występuje p o d elementem x. Dla przykładu permutacje / zbioru {a, b, c, d), taką że f(a)
= d;
f(b)
= a;
f(ć)
= c;
f(d)
= b
zapisujemy następująco: (a b c d\ f
=
\ d
a c b
Jeśli ustalimy porządek elementów w górnym wierszu, t o każdej permutacji od powiada jednoznacznie ciąg zawarty w dolnym wierszu, n p . dla permutacji / jest to (d, a, c, b}. Dlatego też permutacją zbioru «-elementowego X będziemy niekiedy nazywać dowolny ciąg różnowartościowy długości n o elementach ze zbioru X. W naszych rozważaniach natura elementów zbioru X będzie nieistotna — przyjmujemy dla prostoty X = {1, «}. Oznaczmy zbiór wszystkich permutacji tego zbioru przez S . Dowolną permutacje fe S będziemy zwykle identyfikować z ciągiem < d a„>, gdzie a = / ( / ) . Przez złożenie permutacji / , g rozumiemy p e r m u t a c j e fg zdefiniowaną następująco: n
n
1;
t
fgO)=f(g(i)) Zauważmy, że aby wyznaczyć złożenie dwóch permutacji, powiedzmy 1 2 3 4 5\ f
\5 3 2 1 4/
/l 9
2 3 4 5
\2 5 3 1 4
wystarczy zmienić porządek kolumn w permutacji / tak, by w pierwszym wierszu uzyskać ciąg występujący w drugim wierszu permutacji g — drugi wiersz permu tacji / określa wtedy złożenie fg. W naszym przypadku /l 9
=
f
588
2 3 4 5
\2 5 3 1 4 (2 5 3 1 4 \3 4 2 5 1 /l
i
g
=
2 3 4 5
\3 4 2 5 1
Permutacje '\
2...n
A 2 ... n
1.
jr
.-3/17
rACJE
nazywamy permutacją identycznościową. Oczywiście ef = fe = f dla dowolnej permutacji fe S . Łatwo też zauważyć, że każda permutacją feS„ wyznacza jed noznacznie p e r m u t a c j e / , taką żejf' =f~ f=e. Nazywamy ją permutacją odwrotną d o / . Aby ją wyznaczyć, wystarczy zamienić miejscami wiersze w przed stawieniu permutacji / . N a przykład dla n
- 1
1
1
/l 2 3 4 5 f
=
\3 4 2 1 5
otrzymujemy /3 4 2 1 5\ \l
2 3 4 5/
/ l 2 3 4 5\ =
\ 4 3 1 2 5^
Z naszych rozważań wynika, że dla dowolnych permutacji fg,he
S są spełnione n
warunki (fg)h=f(gh)
(1.6)
fe = ef = f
(1.7)
l
1
f- f=ff~ =e
(1.8)
Fakt ten wyrażamy mówiąc, że Ą tworzy grupę ze względu na działanie złożenia. Grupę tę nazywamy grupą symetryczną stopnia n. Dowolny podzbiór G £ S spełniający warunki n
•
f,geG
^fg
e G
feG^f-^G nazywamy grupą permutacji stopnia n. Każdą permutacje feS możemy reprezentować graficznie za pomocą grafu zorientowanego o zbiorze wierzchołków X — {1, «}, w którym x -* y wtedy i tylko wtedy, gdy / ( x ) = y. Od każdego wierzchołka x tego grafu odchodzi d o kładnie jedna krawędź, mianowicie < x , / ( x ) > . Podobnie jedyną krawędzią do chodzącą d o wierzchołka x jest < / (x), x}. Łatwo zauważyć, że startując z do wolnego wierzchołka x i rozważając kolejno wierzchołki x = /(x ), x = ~ f(xj),dochodzimy p o skończonej liczbie kroków do wierzchołka x, t™. x = f(x _ ) = x dla pewnego / > 1. Stąd wniosek, że nasz graf składa się z pewnej liczby cykli elementarnych o rozłącznych zbiorach wierzchołków da jących w sumie cały zbiór X. Załóżmy, że w rozkładzie tym występuje k cykli n
_ 1
0
x
0
2
0
t
l
1
0
a? ... «« J
Takie przedstawienie permutacji nazywamy rozkładem na cykle. Powiemy, że permutacją / jest typu < A A „ > , jeśli zawiera ona w rozkładzie na cykle d o kładnie X cykli o długości i, dla 1 = 1,2, Typ < A , A „ > zapisujemy zwykle symbolicznie l* ... «* (pomijając i* , jeśli A = 0). D l a przykładu permu tacją 1 ;
t
X
1
n
1
(
/ l 2 3 4 5 6 7\ V7 5 1 4 2 3 6 / m a następujący rozkład na cykle: / = [ 1 7 6 3] [2 5] [4] 1
1
1
a więc jest ona typu 1 2 4 . Zilustrowano to n a rys. 1.3.
7
6
2
1
3
i
RYS. 1.3 Rozkład permutacji na cykle
Parę , jeśli a, > aj. Dla dowolnej permutacji feS oznaczamy przez I(f) liczbę jej inwersji oraz definiujemy znak tej permutacji w następujący sposób: (
n
sgn(f)
= (-l)'">
Permutację/nazywamy/>arzys^, jeśli ,s0?i(y) = 1, oraz nieparzystą, jeśli sgn (f) = = — 1. Zilustrujemy te pojęcia n a p a r u przykładach. Permutacją identycznościowa nie zawiera żadnych inwersji, a więc I(e) = 0, i jest to dla każdego n permutacją parzysta. Permutacją m a «(«—1)/2 in wersji (liczba wszystkich p a r > i j jest równa [n} — n (n—l), przy czym każdej parze , / < j odpowiada para (j,i},j> i). Nasza permutacją jest więc parzysta dla n postaci 4k lub 4k+l oraz nieparzysta w pozostałych przy padkach. Permutacją ma następujące inwersje: , , , , ; jest więc nieparzysta. 2
Z n a k permutacji możemy wyznaczyć za pomocą bezpośredniego zliczenia wszystkich inwersji, jednakże algorytm taki wymaga na ogół liczby k r o k ó w rzędu co najmniej liczby inwersji, a więc Q (n ). Pokażemy'teraz algorytm o zło żoności O (ń). Będziemy do tego celu potrzebować kilku lematów. 2
3/19
JUTACJE
! Dowolną permutacje będącą cyklem o długości 2 nazywamy transpozycją. Ważną rolę w dalszych rozważaniach odgrywać będą transpozycje sąsiednich elementów, tzn. transpozycje postaci [i i+i]. LEMAT
1.5
Dowolną permutacje fe S można przedstawić w postaci złożenia I(f) zycji sąsiednich elementów. n
transpo
DOWÓD
Zauważmy przede wszystkim, że jeśli / jest postaci ( a a „ > , a t = [i i+1], to złożenie ft jest postaci (a a - a , a, a , a }. Oznaczamy przez r, liczbę inwersji wprowadzonych przez element i: u
u
r = \{j: j < t
t
aj>
''A
u
i + l
t
i + 2
n
a,}\
Łatwo zauważyć, że w < a ...,a } możemy sprowadzić element 1 = a na pierwszą pozycję, dokonując r transpozycji sąsiednich elementów, następnie element 2 sprowadzić n a drugą pozycję dokonując r transpozycji sąsiednich elementów itd. Ostatecznie, p o r + . . . + r „ = I(f) krokach otrzymujemy ciąg < 1 , n > . Oznacza t o , żeft ... t = e, gdzie t t są pewnymi transpo zycjami sąsiednich elementów. A zatem 1 ;
n
r i + 1
x
2
1
t
/ =
... TK/))"
1
=
H r )
tfj)
...
Hf)
t^ - 1
co kończy dowód lematu, gdyż r LEMAT
u
= t dla dowolnej transpozycji t.
•
1.6
Dla dowolnych permutacji sgn(fg)
=
fgeS
n
sgn(f)sgn(g)
DOWÓD
Załóżmy najpierw, = < « ! , a „ > , to fi == < a
1 ;
że g jest transpozycją
a_ t
a
u
i + 1
, a
a
h
i
+
2
postaci
r = [//+l].
Jeśli / =
,a„>
i oczywiście jeśli a < a t
r ( /
° = {/(/)-!
jeśli a,>a
i
i + 1
+
1
7
W obu przypadkach sgn(ft) = - ( - l ) " ) = -sgn{f). Dowolną permutacje g możemy n a mocy poprzedniego lematu przedstawić w postaci t ... t , gdzie '»»t są transpozycjami sąsiednich elementów i k == I(g). M a m y t
k
k
s
n
a
H»i 9 (f )
= sfl"»(/'i •••?*) = sgnifh =
(-1)*
sgn
(/)
=
SGFRT O )
••• sgn
(/)
= ... •
LEMAT 1.7
Każda transpozycja jest permutacją nieparzystą. Ogólniej, znak dowolnego cyklu o długości k jest równy ( — 1 ) * . _ 1
DOWÓD
Pierwsza część lematu wynika z faktu, iż ciąg i + 1,
można sprowadzić d o ciągu < 1 , . . . , « > dokonując najpierw j—i D " - i
transpozycji
. . . , [ » » + i ]
a następnie ( / — / ) — 1 transpozycji [ i + l J + 2 ] , [i + 2 i + 3 ] , . . . , [ y - l y ] Oznacza t o , że transpozycja [i / ] może być przedstawiona w postaci złoże nia (/— i) + (j—i)—l = 2 (/— i) — 1 transpozycji sąsiednich pozycji. Zgodnie z p o przednimi lematami znak naszej transpozycji [i / ] jest równy ( — l ) ~ ' = — 1. Druga część lematu jest wnioskiem z pierwszej i z faktu, iż dowolny cykl [a ... «,t] jest złożeniem k—l transpozycji: 2 ( y
) - 1
L
[a
x
... a ~\ = [ a ct ] D * 2 a ] ••• k
t
2
«»]
3
•
LEMAT 1 . 8 X i
l
Z n a k dowolnej permutacji / typu 1 . . . n - wyraża się wzorem ln/2J
2 sgn(f)
J
=
1
(-l) °
DOWÓD
Jeśli / m a w rozkładzie n a cykle dokładnie X cykli o długości /, t o wobec p o przednich lematów t
n
ln/2J
Zauważmy, że o liczbie inwersji permutacji zbioru X możemy mówić jedynie w przypadku X — { 1 , ... «}, ogólniej: gdy na zbiorze Z j e s t określony liniowy p o rządek. Jednakże znak permutacji zależy jedynie od jej typu, a więc jest nieza leżny od tego, j a k uporządkujemy zbiór X. Zapowiedziana efektywna metoda znajdowania znaku permutacji polega na znajdowaniu typu tej permutacji i korzystaniu z lematu 1 . 8 . ALGORYTM 1.9 (Znajdowanie znaku permutacji) Dane:
Dowolna permutacją feS„ =
d a n a w postaci ciągu P [ l ] , ... ,P [ « ] ( P [ » ] =
/('))•
Wyniki: P o zakończeniu działania algorytmu s = sgn (f).
I % 3 4 5 6 7 g 9
10 11
begin s ••= 1; for i := 1 to n do NOWY[i'] •.= tnie; for i := 1 to « do if NOWY\i"\ then (* znajdź cykl zawierający i *) begin j : = P [ i ] ; while y # i do begin NOWY[j~\ ••= false; s ••= -s; j ••= P\j~\ end end end
Algorytm ten przegląda kolejno pozycje 1, ..., n permutacji (pętla 4) i za każdym razem gdy element P [ i ] nie był jeszcze analizowany (NOWY\i~\ — true) wyzna cza cykl, do którego ten element należy (blok 6). Zauważmy, że jeśli cykl ten jest długości k, to pętla 7 jest wykonywana k—l razy. W konsekwencji wykonanie tej pętli zmienia znak zmiennej s na przeciwny wtedy i tylko wtedy, gdy k jest parzyste. Wartość początkowa zmiennej s jest równa jedności, a więc p o znale zieniu wszystkich cykli s = (—1)", gdzie p jest liczbą cykli parzystej długości. Wobec lematu 1.8 mamy s — sgn{f). Łatwo się też przekonać, że liczba kroków algorytmu jest rzędu n dla d o wolnej permutacji / e S„. Aby to wykazać, zauważmy, że sumaryczna liczba kro ków wykonywanych w pętli 4, nie licząc kroków w wewnętrznym bloku 6, jest O (n). Sumaryczna liczba kroków wykonywanych w bloku 6 w trakcie działania algo rytmu jest rzędu sumy długości wszystkich cykli, zatem również O («). Daje to całkowitą złożoność O (n).
Generowanie permutacji Zajmiemy się teraz algorytmami generowania wszystkich n! permutacji zbioru "^elementowego. Zagadnienie to ma bogatą literaturę (por. n p . artykuł [60]) i jeszcze dłuższą historię, której źródeł można się doszukać w początkach XVII wie ku, kiedy to w Anglii powstała specjalna sztuka bicia w dzwony polegająca — w pewnym uproszczeniu — na wybiciu na n różnych dzwonach wszystkich n! permutacji [14], [74]. Premutacje te należało wybijać „z pamięci", co spowodo wało, iż adepci tej sztuki znaleźli pewne proste metody systematycznego gene rowania wszystkich permutacji (bez powtórzeń). Niektóre z tych metod zostały niezależnie odkryte współcześnie w kontekście maszyn cyfrowych. Sztuka ta — h o ć mało znana w Polsce — przetrwała po nasze czasy, skoro słynna Księga ^kordów Guinnesa [29] zawiera wzmiankę o wybiciu wszystkich 8! = 40320 per mutacji na 8 dzwonach w 1963 roku — ustanowienie tego rekordu trwało 17 goc
^
n
58 ~2 minuty! Oczywyście użycie maszyny cyfrowej pozwala generować per-
mutacje znacznie szybciej, jednak różnica nie jest aż tak duża, jak by się to mogło wydawać — w ciągu 18 godzin nawet bardzo szybka maszyna nie wygeneruje wszystkich permutacji zbioru n-elementowego, jeśli n > 13 (z drugiej strony per mutacje zbioru 8-elementowego można otrzymać w ciągu ułamka sekundy). Jest t o p o prostu konsekwencja faktu, iż n! rośnie bardzo szybko ze wzrostem n. W punkcie tym opiszemy trzy różne metody generowania ciągu wszystkich n! permutacji zbioru n-elementowego. Zakładać będziemy, że elementy naszego zbioru są pamiętane w tablicy P [ l ] , ...,P [ « ] . We wszystkich trzech metodach elementarną operacją, której poddaje się tablicę P, jest pojedyncza transpozycja, tzn. wymiana zawartości zmiennych P [i] oraz P\j\, gdzie 1 < i,j < n. Operację tę oznaczać będziemy przez P [f] —-.P [ y ] . Oczywiście jest ona równoważna ciągowi instrukcji pom := P [ i ] ;
P [i] == Pif];
P [ j ] := pom;
gdzie pom jest pewną zmienną pomocniczą. Pierwszą z metod, które opiszemy, najłatwiej zrozumieć, jeśli permutowanymi elementami są liczby 1 , 2 , . . . , « . N a zbiorze wszystkich permutacji — ogólniej, na zbiorze wszystkich ciągów długości n o elementach ze zbioru X = { 1 , « } — jest określony porządek leksykogrąficzny: <x
1 ;
...,*„> < !,
...,y } n
o istnieje k > 1, takie że x
k
< y
k
oraz x = y t
t
dla każdego l < k
Zauważmy, że jeśli zamiast liczb 1, . . . , « rozważać litery a,b, ... z naturalnym porządkiem a < b < c < ... < z, to porządek leksykogrąficzny określa stan dardową kolejność, w jakiej wyrazy o długości n pojawiają się w słowniku. Po rządek antyleksykogrąficzny, oznaczany przez < ' , definiujemy podobnie, z tym że zarówno kolejność pozycji w ciągu, j a k i uporządkowanie elementów zbioru X ulega odwróceniu: < ' <Ji, •••,>'„>
o istnieje k < «, takie że x > y oraz x — k
k
t
dla / > k
Dla przykładu podajemy teraz permutacje zbioru X = {1, 2, 3} w porządku leksykograficznym (a) oraz antyleksykograficznym (b): (a) 1 2 3
(b) 1 2 3
1 3 2
2 1 3
2 1 3
1 3 2
2 3 1
3 1 2
3 1
2
2 3 1
3 2 1
3 2 1
ftOWANIE
rtRMUlAUl
i wygodniej jest sformułować algorytm generowania permutacji w porządku gBłyieksykograficznym. Zauważmy w tym celu, że ciąg permutacji zbioru {1, . . . , « } yt tym p o r z ą d k u m a następujące własności, wynikające bezpośrednio z defimcji : ( A l ) W pierwszej permutacji elementy występują w rosnącej kolejności, a w ostatniej w malejącej; innymi słowy, ostatnia permutacją jest odwróceniem pierwszej(A2) Nasz ciąg m o ż n a podzielić na n bloków długości (« — 1)! odpowiadają cych malejącym wartościom elementu w ostatniej pozycji. Pierwsze n—l pozycji bloku zawierającego element p w ostatniej pozycji określa ciąg premutacji zbio ru {1, ...,n}\{p} w porządku antyleksykograficznym. Własności te sugerują następujący prosty algorytm rekurencyjny: ALGORYTM 1.10 (Generowanie wszystkich permutacji w. porządku kograficznym)
antyleksy
Dane: n Wyniki: Ciąg permutacji zbioru {1, . . . , « } w porządku antyleksykograficznym. 1 2 3 4 5 6 7 8 9 10 11 12 13 H !5 17 18 19 20 ^
fP
procedurę REVERSE(rri); ( * odwrócenie ciągu P\\],...,P\m\; tablica P jest globalna *) begin i ••= 1; j -.= m; while i < j do b e g i n i > [ / ] : = : P [ / ] ; i : = i + l ; j-.= j - \ end end; (* REVERSE *) procedurę ANTYLEX(m); ( * tablica P jest globalna *) begin if m = 1 then ( * - P f l ] , . . . , / * [ « ] zawiera nową permutacje *) write ( P [ 1 ] , . . . , P [ « ] ) else for i — 1 to m do begin ANTYLEX(m -1); if i < m then begin P[i] .= :P[m\; REVERSE(m — 1) end end end; (* ANTYLEX *) begin (* program główny *) for i := 1 to n do P [i] :=: i; ANTYLEX(n) end
Aby zrozumieć działanie tego algorytmu zauważmy przede wszystkim, że wyko nanie procedury REVERSE(m) powoduje odwrócenie kolejności ciągu elemen tów w -P [ 1 ] , ...,P\rń\. Aby udowodnić poprawność algorytmu wystarczy p o kazać, przez indukcję względem m, że jeśli P [ l ] < ... ,
1 ;
r
u
r
r
O^nti
r
0<m elementowych zbioru n-elementowego oznaczać będziemy przez ^j. du P
a
Symbol ^
zwany jest współczynnikiem
następujący wzór na n-tą potęgę dwumianu
(x+
:
dwumiennym ze wzglę
x+y:
y >" = Ż^k) ~ >
xiyn
i
( L 1 3 )
Aby się przekonać o prawdziwości tego wzoru wystarczy zauważyć, że współczyn nik przy x' y~ jest równy liczbie sposobów, w jaki spośród n czynników iloczy nu (x+y) ... (x+y) można wybrać k czynników j a k o te, z których wybieramy składnik x. l
Oczywiście
= 0 dla k>n.
W a r t o wspomnieć, że podzbiory £-elemen-
towe zbioru n-elementowego nazywa się też w starszej literaturze kombinatorycznej kombinacjami k-wyrazowymi ze zbioru n-elementowego bez powtórzeń. Ze współczynnikami dwumiennymi związanych jest wiele ciekawych toż samości. Oto niektóre z nich.
(1.14) I-O
x
'
Wzór ten wynika stąd, że suma p o lewej stronie wyraża liczbę wszystkich pod zbiorów zbioru n-elementowego.
1
ni"1= 0
V
-/
' -V ' \ • V
, ,i •
•'• •-\-X'\
(1.15)
7
Dla dowodu utwórzmy listę zawierającą kolejno wszystkie podzbiory zbioru n-elementowego X. Lista ta zawiera (^j podzbiorów /-elementowych dla i = =
1 ; . . . , » , tak więc jej długość (tzn. liczba wystąpień elementów zbioru X) wyraża się sumą p o lewej stronie wzoru (1.15). Z drugiej strony każdy element * 6 X występuje n a liście 2 " razy, gdyż taka jest liczba podzbiorów zawierają cych x (jest ich tyle, ile wszystkich podzbiorów zbioru A " \ { x } ) . Długość naszej listy jest więc równa n2"~ . Dowód jest tym samym zakończony. - 1
l
6) • (:"*) t o bezpośrednia konsekwencja faktu, iż każdemu podzbiorowi
(116) fc-elemen-
towemu r " c Z odpowiada wzajemnie jednoznacznie (n — fc)-elementowy pod zbiór X\Y zbioru X.
- frK:!)
•
^
Wzór ten otrzymujemy przez następujące rozumowanie. Ustalmy pewien ele ment x zbioru n-elementowego X. Zbiór wszystkich podzbiorów
fc-elementowych
zbioru X rozpada się na dwie rozłączne klasy: tych podzbiorów, które nie za wierają elementu x, oraz tych, które x zawierają. Liczność pierwszej klasy wy nosi
drugiej zaś Q
^ , tyle ile jest podzbiorów
(k-l)-elementowych
zbioru Tożsamość (1.17) wiąże się ściśle z następującym trójkątem
Pascala:
1 1
1
1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1 Jeśli ponumerować kolejne wiersze tego trójkąta liczbami 0, 1,2, zawiera liczby
to i-ty wiersz
oo i: N a mocy wzoru (1.17) każdą z tych liczb — oprócz skrajnych, równych jed ności — można otrzymać j a k o sumę występujących n a d nią liczb w poprzednim wierszu. Daje to prostą metodę generowania trójkąta Pascala, a tym samym znajdowania współczynników rozwinięcia (x+y)' — dane są one przez /-ty wiersz trójkąta (por. (1.13)). Udowodnimy jeszcze jedną tożsamość związaną ze współczynnikami dwumiennymi, a mianowicie następującą tożsamość Cauchfego: m + n\
VH
/m\
(
n
\ (L18)
k ) - 2 (,)(*-,)
W tym celu wyobraźmy sobie, że z grupy złożonej z m mężczyzn i n kobiet chcemy wybrać k osób. Możemy to uczynić na ('"^
sposobów (lewa strona). Wszystkie
podzbiory A>elementowe naszego zbioru osób możemy sklasyfikować ze względu n a liczbę mężczyzn w podzbiorze. Podzbiór fc-elementowy zawierający s mężczyzn możemy otrzymać wybierając najpierw ^ mężczyzn — na jeden z
możliwych
^i§obów 3 t
|fc
p
J sposobów. Wszy-
— a następnie k—s kobiet, na jeden spośród
możliwych podzbiorów k osób, w tym s mężczyzn, jest zatem
^ "J •
jeacośrednio stąd wynika już wzór (1.18). Zauważmy, że dla m = k = n wzór ten przybiera postać
(1.19)
© - i o " Ostatnią tożsamością, którą udowodnimy jest
C)C)=C)(r-r) Dla dowodu policzmy liczbę par podzbiorów zbioru n-elementowego X, takich że AT s M, \K\ = k,\M\ brać na ^1
= m. Z jednej strony podzbiór K możemy wy
sposobów, a podzbiór M £ K n a
sposobów, co daje
j
m o | i w y c h p a r (lewa strona ( 1 . 2 0 ) ) . Z drugiej strony, dla każdego z ^ podzbiorów M z X możemy wybrać n a sposobów podzbiór K E S Af, gdyż taki podzbiór AT wyznaczony jest jednoznacznie przez podzbiór (n—ifc)-ełementowy X\K zbioru («—»i)-elementowego X\M. Szukana liczba par <Jf, My jest więc równa QJ
(H-T) ( P
r a w a
strona ( 1 . 2 0 ) ) .
Podamy teraz bezpośredni wzór pozwalający na obliczanie
^j.
TWIERDZENIE 1 . 1 4
C) k/
[n]
w! n ( n - l ) . . . ( n - f e + l) fel(n-fe)! 1 - 2 - ... -fe
t
fe!
{ 1
'
2 1 )
DoW!6d
Ka$$j? spośród [«],( ciągów różnowartościowych długości k wyznacza podzbiór fe-etementowy złożony z elementów występujących w tym ciągu, przy czym ten D$?©dzbiór S otrzymujemy z dokładnie kl ciągów, odpowiadających wszystkim sa
PermWacjom zbioru S. Stąd Q
= [«]*/£!. Wystarczy teraz skorzystać z twier-
toma*. 1.2.
B
Zauważmy, że twierdzenie to pozwala łatwo udowodnić wszystkie tożsamorozważane w tym punkcie. N a przykład dla (1.17) m a m y
5 0 1
n
!
(\ W !
" k\(n-k)l _
(n-1)!
fel(n-l-fe)!
n l
_ ~
n
fe!(n-fe)! +
k
(~ \ n
(n-1)!
(fe-l)l(n-fe)!
+
n) _
Ji\_ ~
fn-l\
\ k
^
(n-l
) ^
\k-\
/
tego typu „algebraiczny" dowód polegający na mechanicznym prze-
kształcaniu wyrażeń jest znacznie mniej przejrzysty od dowodu „kombinatorycznego" pokazanego poprzednio. Z drugiej strony wzór ( 1 . 2 1 ) pozwala łatwo udowodnić następującą własność współczynników dwumiennych:
(ó) (") K
K
- U) "
( w » )
" (r»/a
-i)
n—i
n (n — l ) . . . (n — i + l )
l)
i+ l
K
+
. )
=• - * ( » )
(
L
2
2
)
(n > 1 ) . Wystarczy zauważyć, że n
) i ++ 1l)/ ~
" ( " - ! ) — ("• 1 - 2 - ... -i(i + +
1-2-
... -i
n-i i+ l M a m y ( n - i ) / ( i + l ) > 1 dla i < ( n - l ) / 2 , tzn. dla i < Ln/2J, podobnie ( n - i ) / ( i + l ) < l dla i > ( « - l ) / 2 , tzn. dla i > fn/21, oraz (n-Ln/2J)/(ln/2J + l) = = fn/21/fn/21 = 1, jeśli n nieparzyste (dla parzystego n m a m y Ln/2J = fn/21 i środ kowa równość w ( 1 . 2 2 ) oczywiście zachodzi). Zajmiemy się teraz znalezieniem liczby A>elementowych podzbiorów zbioru z powtórzeniami (k*x , k*x„). Pytamy, innymi słowy, na ile sposobów można utworzyć A>elementowy zbiór z powtórzeniami mając do dyspozycji n różnych elementów, powiedzmy 1, . . . , n , z których każdy możemy użyć dowolną ilość razy. W a r t o zauważyć, że liczba ta jest równa liczbie ciągów niemalejących dłu gości k o elementach ze zbioru { 1 , n}. Wynika to z faktu, że elementy każdego podzbioru dają się jednoznacznie ustawić w ciąg niemalejący. Oczywiście pod zbiorem bez powtórzeń odpowiadają ciągi rosnące. 1
TWIERDZENIE 1 . 1 5
Liczba A>elementowych podzbiorów zbioru (k*x
u
...,k*x„)
er)
jest równa (1.23)
DOWÓD
M a m y wyznaczyć liczbę ciągów niemalejących < c , ...,a } o elementach ze zbioru { 1 , n } . Każdy taki ciąg można podzielić na n sekcji, gdzie i-ta sekcja zawiera pewną — być może zerową — liczbę następujących p o sobie elementów i. Jeśli sekcje te oddzielimy od siebie n — 1 zerami użytymi w charakterze separato rów, to otrzymamy ciąg długości k+n—l. N a przykład dla n = 5, k = 4 cią gowi < 2 , 2 , 4 , 5 > odpowiada ciąg < 0 , 2 , 2 , 0 , 0 , 4 , 0 , 5 > . Ten ostatni ciąg jest jednoznacznie wyznaczony przez rozmieszczenie występujących w nim n — 1 zer. Istotnie, możemy go odtworzyć wypełniając sekcję do pierwszego zera wystą pieniami elementu 1, sekcję od pierwszego do drugiego zera wystąpieniami ele mentu 2 itd. Lecz liczba rozmieszczeń n—l na k + n— 1 pozycjach jest równa x
/k + n - l \ \
n-1
)
(
n + k-l
\
V(n + / c - l ) - n - l j
/n + =
V
k-V k
k
Znalezioną przez nas liczbę podzbiorów z powtórzeniami można zapisać nieco inaczej: ^n + k - l ^
n(n + l)...(n +
=
fc-l)
[k^_
=
( 1
2
4
)
pokażemy interpretację kombinatoryczną tej równości. Przypomnijmy w tym celo, ze [n]* jest liczbą rozmieszczeń uporządkowanych k elementów x , ...,x n pudełkach. Zauważmy, że każdemu takiemu rozmieszczeniu zawierającemu r elementów w /-tym pudełku odpowiada ^-elementowy podzbiór ( > i * J i , r *y„) zbioru z powtórzeniami (k*y , k*y„). W tym przyporządkowaniu istotna jest jedynie liczba elementów w każdym z pudełek. A więc na przykład roz mieszczeniom x
k
w
t
n
x
pudełko
1
pudełko 2
pudełko 3
jc X
*S l
X* Xi
x x
3
x
2
2
x
i
x
3
5
odpowiada ten sam podzbiór ( 2 * j 3 * j ) . Jasne jest, że każde dwa rozmieszcze nia odpowiadające temu samemu podzbiorowi różnią się permutacją obiek tów x x . W konsekwencji liczba wszystkich A>elementowych podzbiorów zbioru z powtórzeniami (k*y k*y ) jest równa [ri] /k\. Oczywiście rozumo wanie to wraz ze wzorem (1.24) stanowi inny dowód twierdzenia 1.15. 1 (
t
3
k
k
u
n
Generowanie podzbiorów ^-elementowych Pokażemy teraz dwa algorytmy generowania wszystkich fc-elementowych pod zbiorów zbioru n-elementowego X. Bez zmniejszenia ogólności możemy przyjąć, że X = { 1 , n } . Każdemu fc-elementowemu podzbiorowi odpowiada wtedy wzajemnie jednoznacznie ciąg rosnący długości k o elementach z X: na przykład podzbiorowi {3, 5, 1} odpowiada ciąg . Można łatwo pokazać algorytm generujący wszystkie takie ciągi w porządku leksykogrąficznym. Wystarczy w tym celu zauważyć, że w porządku tym, ciągiem bezpośrednio następującym p o < a ...,«*> jest 1 ;
b} = x, b > y oraz dla dowolnego elementu c takiego, że c > x, c > y mamy c > b. Elementy takie — jeśli istnieją — są jednoznacznie wyznaczone przez x i y. Istotnie, dla dowolnych elementów a a spełniających warunek (a) mamy a < a l 5
2
2
x
l/42
1.8/43
^ p S A Ł Y ZBIORU
1 8 ol?N °
l
2
C Z j r
fll
=
2
0 (
m e
a
E
e
m
e
n
t
a
^ ° ' ^ ° ' P *°k ^ l nazywamy kresem doly0 elementów A:, y i oznaczamy przez A A y, element b natomiast nazywamy u esęm górnym i oznaczamy przez x v y.
n
r
Tprzykładem kraty jest (&(X),
£ > . W tym przypadku mamy
oczywi
ś c i e A A B = A n B oraz A v B = A u 5 . TWIERDZENIE
1.17
Zbiór 77 ( X ) uporządkowany przez relację rozdrobnienia < tworzy kratę, przy czyss
HA
a = {Ac\B:(Aen)
A (Bea)
A (A n B * 0 ) }
(1.29)
tzn. £ ( j t A
a)
=
(1.30)
£ ( 7 t ) n £ ( « j )
podział u v ff jest natomiast określony następująco: {x, y} eE(n
v er) 1 oraz ciąg x , x taki, że x = x y = x* oraz <x , x i > e e E ( 7 t ) lub <x,, x > £ £ (er) dla i — = 1,2,fe-1. x
u
(1.31)
t
(
i +
( + 1
DoWto Zauważmy przede wszystkim, że prostym wnioskiem z definicji relacji równo ważności jest fakt, iż przecięcie dwóch relacji równoważności jest relacją rów noważności. T a k więc E(n) r\ E (er) jest relacją równoważności, która z kolei wyznacza jednoznacznie pewien podział a taki, że E(n) n E (er) = E (a) (por. (1.27)). Oczywiście £ (a) £ £ (7t), £ (a) £ £ (er), a więc a < jr, a < er. C o więcej, dla każdego podziału a' takiego, że a' < n, a' < o- mamy £ (a') £ E(n),E(ot') £ £ £( n. Przyjmujemy również S (0,0) = 1, gdyż pusta rodzina bloków jest — zgodnie z definicją — podziałem zbioru pustego. Z liczbami Stirlinga drugiego rodzaju związane jest — podobnie j a k ze współ czynnikami dwumiennymi — wiele ciekawych tożsamości. Pokażemy najpierw tożsamość przypominającą nieco wzór (1.17) związany z trójkątem Pascala: S(n,k)
= S(n-l,
k-l)
+ kS(n-l,
k)
dla 0 < k < n
(1.33)
S(n,n)
= 1
dla n ^ 0
(1.34)
S(n,0)
= 0
dla n > 0
(1.35)
Wzory (1.34) i (1.35) są oczywiste. Dla dowodu wzoru (1.33) rozważmy zbiór wszystkich podziałów zbioru {1, . . . , « } na k bloków. Zbiór ten rozpada się na dwie rozłączne klasy: tych podziałów, które zawierają blok jednoelementowy {n}, oraz tych podziałów, dla których n jest elementem większego (co najmniej dwuelementowego) bloku. Liczność pierwszej klasy jest równa S(n—l, k—l), tyle ile jest podziałów zbioru {1, ...,n— 1} n a fc— 1 bloków. Liczność drugiej klasy wynosi kS (n— 1, k), gdyż każdemu podziałowi zbioru {1, . . . , « — 1} na fc bloków odpowiada w tej klasie dokładnie k podziałów powstałych przez dodanie ele mentu n kolejno d o każdego z bloków. Wzory (1.33), (1.34) i (1.35) umożliwiają łatwe wyznaczanie wartości S (n, k), nawet dla dużych wartości n i k. Liczby S (n, k) dla 0 < n, k < 10 przedstawiono w tabl. 1.2. Zauważmy, że tablicę tę można traktować j a k o „trójkąt Stirlinga", w którym każdą wartość — oprócz skrajnych, równych jedności — można otrzymać j a k o sumę liczb występujących nad nią, dokładniej liczby występującej dokładnie nad nią pomnożonej przez k, oraz liczby nad nią p o lewej stronie.
|Y STIRLINGA
1.2 Liczby Stirlinga drugiego rodzaju
t «
2
3
0 0 1 3 7 15 31 63 127 25S 311
0 0 0 1
i 25 90 301 966 3025 9330
S(n,k) 6
7
8
9
10
0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 10 1 65 15 . 1 21 350 140 266 1701 1050 7770 6951 2646 34105 42525 22827
0 0 0 0 0 0 0 1 28 462 5880
0 0 0 0 0 0 0 0 1 36 750
0 0 0 0 0 0 0 0 0 1 43
0 0 0 0 0 0 0 0 0 0 1
5
4
%Jtp przykład innej zależności rekurencyjnej związanej z liczbami Stirlinga * ib rodzaju: =
^
".
)S(i,
fc-1)
dla fe > 2
(1.36)
D l c j p w o d u rozważmy zbiór wszystkich S (n, fe) podziałów zbioru X = {1, «}. Zbi#Men rozpada się na rozłączne klasy odpowiadające różnym podzbiorom zbiorą X będącym blokiem zawierającym element n. Zauważmy, że dla każdego 6-dtottentowego podzbioru B £ X zawierającego element n istnieje dokład ni©JĘĄn—b, fe— 1) podziałów zbioru X na fe bloków zawierających B w charaktera* ;feloku. Istotnie, każdy taki podzia} odpowiada jednoznacznie podziałowi z b k p j X\B na fe — 1 bloków. Zbiór 6-elementowy B £ X zawierający element n moiieay wybrać na
T F E F C ) -
sposobów, tak więc
J£
r_ J5(«-fc,fe-l)= 1
] ?
r_ )s(n~b,k-l) b
=
n-1
*
=
(" ^
i=k-l
)S(i,k-l)
Ęjczbę Bella B definiujemy j a k o liczbę wszystkich podziałów zbioru w-eleo n
* . = |J7(X)|,
gdzie \X\ = n
(1.37)
słowy B,=
]?S(n,k)
(1.38)
4=0
^ l l f c o d n i m y teraz następującą prostą zależność rekurencyjną związaną z licz« * Bella: b
n
a = y( ) + 1
Bi
(1.39)
(przyjmujemy B = 1). D o w ó d przebiega podobnie j a k w przypadku zależ ności (1.36). Zbiór wszystkich podziałów zbioru X — {1, n+ 1} możemy roz łożyć na rozłączne klasy w zależności od bloku B zawierającego element n + 1 , lub — równoważnie — w zależności od zbioru X\B. Dla zbioru X\B s £ {1, n} istnieje dokładnie \II (X\B)\ = B\ podziałów zbioru Xzawiera jących B w charakterze bloku. Grupując nasze klasy w zależności od liczności zbioru X\B otrzymujemy wzór (1.39). 0
X B]
Liczby B„ dla 0 < n < 2 0 przedstawiono w tabl. 1.3.
TABLICA 1.3 Liczby Bella B„ N
B N
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
I 1 2 5 15 52 203 877 4140 21147 115975 678570 4213597 27644437 190899322 1382958545 10480142147 82864869804 682076806159 5832742205057 51724158235372
Istnieje ścisły związek między liczbami S (n, k) a liczbą wszystkich funkcji ze zbioru n-elementowego n a zbiór fc-elementowy, tzn. f u n k c j i / : X -* Y,f(X) = = Y dla |JSf| = n, \ Y\ = k. Każdej takiej funkcji / możemy przyporządkować następujący podział zbioru X na k b o k ó w : N(f)
= {f-\y):yeY}
(1.40) 1
zwany jądrem f u n k c j i / (warunek f(X) = Y gwarantuje, że podzbiory f~ (y) są niepuste). Z drugiej strony nietrudno zauważyć, że każdemu podziałowi n e e II (X) odpowiada dokładnie kl funkcji z X na Y takich, że N (/) = n. Każda taka funkcja odpowiada wzajemnie jednoznacznie przyporządkowaniu blokom podziału n elementów zbioru Y. Oznaczając przez s„ liczbę funkcji z X na Y otrzymujemy więc k
ik
s ,k = k\ n
S(n,k)
(1.41)
V STIRLINGA
w ^ r r y s t a i a c z tego wzoru możemy udowodnić jeszcze jedną własność liczb StJrjinga drugiego rodzaju, k t ó r a dotyczy związku między wielomianami x* •wielomianami a
[ x ] . = x ( x - l ) . . . ( x - f c + l)
(1.42)
Dowolny wielomian P (x) zmiennej x stopnia n możemy jednoznacznie przęd LI
stawie j a k o P (x) = J £ a [x] . k-0 k
k
Jest
to
szczególny
przypadek
oczywistego
ii 1
faktu, iz istnieje jednoznaczny rozkład P (x) = JT a p (x) k
fi
k
dla
dowolnego
k= 0
ciąga wielomianów p (x), p^ipc), ... takiego, że p (x) jest stopnia k dla każde go k ^ 0. Innymi słowy każdy taki ciąg stanowi bazę w przestrzeni liniowej wielfomianów. Okazuje się, że liczby Stirlinga drugiego rodzaju są równe dokład nie współczynnikom przejścia z bazy \,x, x , ... d o bazy 1, [x] [x~] , ••• 0
k
2
u
**
2
5
TWpUłZENIE
1.18
Dla każdego n > 0 - x » = 2? ^ ( » , & ) [ * ] . t=o
(1-43)
DOWÓD
Załóżmy najpierw, że x jest nieujemną liczbą całkowitą. Policzymy n a dwa sposoby liczbę wszystkich funkcji / : A -* B, gdzie \A\ = n, \B\ = x. Z jednej strony jest o n a równa x" (p. twierdzenie 1.1). Z drugiej strony zbiór takich funk cji /jftożemy sklasyfikować ze względu n a zbiór f(A). Oczywiście każda funkcja / jest odwzorowaniem zbioru A n a zbiór / (A), tak więc dla dowolnego podzbio ru Y S B, gdzie \ Y\ = k, liczba wszystkich f u n k c j i / : A ->• B takich, że f(A) = Y jest równa s„ , czyli, zgodnie ze wzorem (1.41), k\ S(n, k). Biorąc pod uwagę tk
fakt, że podzbiór Y o liczności k możemy wybrać na
sposobów otrzymujemy
ostatecznie
-id
k\S(n,k)
= ^[>],S(n,/c)
(1.44)
*=0 (górny wskaźnik sumowania mogliśmy zamienić z x na n, gdyż 5 (n, A:) = 0 > n, oraz [ x ] = 0 dla k > x). Skoro równość wielomianów zachodzi dla dowolnego całkowitego x ^ 0, wielomiany te są tożsamościowo równe (gdyż ich różnica jest albo tożsamościowo równa zeru, albo m a skończoną liczbę zer* • fc
Liczby Stirlinga pierwszego rodzaju s («, k) definiujemy j a k o współczynniki Prsy kolejnych potęgach zmiennej x w wielomianie [x] : k
n " W . = *1-
k
y (n,k)x 0 S
K=
(1.45)
Innymi słowy liczby s (n, fe) spełniają rolę odwrotną w stosunku d o liczb S (n, k) — pozwalają przejść z bazy 1, [pc]i, [x] > ••• do bazy 1, x, x , ... Oczywiście s (n, k) = = 0 dła k > n. Liczby s (n, k) wygodnie jest wyznaczać korzystając z następu jących zależności rekurencyjnych: 2
2
s(n,k)
= s(n-l,k-l)-(n-l)s(n-l,k)
dla 0 < fe < n
(1.46)
s(«,n) = l
d i a n 3*0
(1.47)
s(n,0) = 0
dla n > 0
(1.48)
Wzory (1.47) i (1.48) są oczywiste, natomiast (1.46) otrzymujemy porównując współczynniki przy x* p o obu stronach równości W .
=
[*]„-1 ( * - »
+ »
d-49)
M a m y mianowicie n
n-1
2s(n,k)x«
k
= (x-n
+ l ) £ s(n-l,k)x *=o
t=o
=
n-1
n— 1 k+l
^ Ą * f
= £ s(n-\,k)x -(n-l) *=o
£ s(n, fe)x* = *=o
n- 1
= £
(s ( n - 1 ,
fc-l)-(n-l)s
( n - 1 , *;))** +
*= i B
+ s(n-l, n-l)x -(n-l)s(n-l,0) W tablicy 1.4 przedstawiono liczby s(n, fe) dla 0 < « , fe < 10. TABLICA
\
1.4 Liczby Stirlinga pierwszego rodzaju
k
0 1 2 3 4 5 6 7 8 9 10
0
1
1 0 0 0 0 0 0 0 0 0 0
0 1 -1 2 -6 24 -120 720 -3040 40320 -362880
s(n,k)
3
4
5
6
7
8
9
0 0 0 0 1 0 -3 1 11 -4 35 -50 274 -225 -1744 1624 13060 -13132 -109584 118124 1026576 -1172700
0 0 0 0 1 -10 85 -735 6769 -67284 723680
0 0 0 0 0 1 -15 175 -1960 22449 -269325
0
0 0 0
0 0 0 0 0 0 0 0 1 -36 870
0 0 0 0 0 0 0
2
0 0 0 0 0 1 -21 322 -4536 63273
0 0 0 0 1 -28 546 -9450
0 0 1
-15
Generowanie podziałów zbioru Opiszemy teraz algorytm generowania wszystkich podziałów zbioru. Ideę tego algorytmu najłatwiej wyjaśnić formułując go najpierw w postaci rekurencyjnej. Zauważmy najpierw, że każdy podział JI zbioru {1, n} wyznacza jednoznacznie podział it -i zbioru {1, n — 1} powstały z JI przez usunięcie elementu n z od powiedniego bloku (i usunięcie powstałego pustego bloku, jeśli element n twon
i/4$1
f2
HOWANIE P O D Z I A Ł Ó W Z B I O R U
l.lo/49
y J blok jednoelementowy). N a odwrót, mając dany podział a = {B , v
B} k
zbiom {l, . . . , « - l } łatwo znaleźć wszystkie podziały n zbioru {1, . . , « } takie, że ffn-i
=
ff
* ^
ą
t
o
By u { n } , 5 , 2
Bi,B
m
i
a n o w
c
e
i i
podziały
...,B
k
u {«}.
2
:
(1.50)
Bi,B ,...,B u{n} 2
k
B ,B ,...,B ,{n} x
2
(1.51)
k
Sugeruje to następującą prostą metodę rekurencyjną generowania wszystkich podziałów: Mając daną listę L„_ wszystkich podziałów zbioru ( 1 , . . . , « — 1} tworzymy listę L wszystkich podziałów zbioru {1, «} przez zamianę każdego podziału a na liście L _y odpowiadającym m u ciągiem (1.50). Zauważmy, że możemy przy tym zagwarantować, by kolejne podziały mało się od siebie róż niły — dokładniej mówiąc możemy zakładać, że każdy następny podział na liście powstaje z poprzedniego przez usunięcie pewnego elementu z pewnego bloku (może to spowodować usunięcie bloku jednoelementowego) i dodanie go d o innego bloku lub też utworzenie z niego bloku jednoelementowego. Istotnie, kolejne podziały ciągu (1.50) spełniają ten warunek. Jeśli odwrócić kolejność ciągu (1.50) dla co drugiego podziału listy L - to element n porusza się na zmia nę do przodu i d o tyłu, i podziały „ n a styku" ciągów utworzonych z kolejnych podziałów listy Z,„_! mało się od siebie różnią (przy założenu, że kolejne podziały listy £,„_! mało się od siebie różnią). N a rysunku 1.12 pokazano konstrukcję listy L , dla n = 1, 2, 3 (podziały przedstawiono w nieco uproszczonym zapisie, np. (12) (3) oznacza {{1,2}, {3}}). x
n
n
n
0
(1.52)
k= 1
(przyjmujemy P (0, 0) = P (0) = 1). Dla przakładu P (J) = 15 i wszystkie po działy liczby 7 przedstawiono na rys. 1.14.
7 ó
1
5 •2 5 1 4 3 4 2 3 3
3 2
1
1 3 2 2 1 2 2
R y s . 1.14 Ciąg p o d z i a ł ó w liczby 7 skonstruowany
2
1
1
l
rytm
1
przez
algo
1.22
Wiele ciekawych własności liczb P (n) można udowodnić używając bardzo przejrzystego sposobu reprezentowania podziału liczby zwanego diagramem Ferrersa. Diagram Ferrersa dla podziału n = aj 4 - . . . + ^ składa się z k wierszy odpowiadających składnikom podziału, przy czym i-ty wiersz zawiera ciąg a punktów (rys. 1.15). Każdemu podziałowi liczby n odpowiada jednoznacznie podział sprzężony J liczby, który otrzymujemy przez transpozycję (zamianę roli wierszy i kolumn) diagramu Ferrersa (por. zad. 1.15). Łatwo zauważyć, że transpozycja diagramu
te
11
• • • • • •
• • •
16= 16=4+4+3+3+1+1 RYS,
I |E 5
tv -Uiagram
Ferrersa
dla
podziału
liczby
i
podziału
do
niego
sprężonego
Ferrersa określa wzajemnie jednoznaczną odpowiedniość między podziałami liczby n na k składników a podziałami liczby n o największym składniku równym k. Odnotujmy ten fakt: TWIERDZENIE
1.20
Liczba podziałów liczby n na k składników jest równa liczbie podziałów liczby n o największym składniku równym k. • Udowodnimy jeszcze jedno twierdzenie tego typu. TWIERDZENIE
1.21
Liczba podziałów liczby n na parami różne składniki jest równa liczbie podziałów liczby n na nieparzyste składniki. DOWÓD
Pokażemy wzajemnie jednoznaczną odpowiedniość między podziałami, o których mowa w twierdzeniu. Rozważmy podział liczby n n a nieparzyste składniki b ...,b„, gdzie składnik b występuje w podziale r razy, 1 < i < / > . Niech u
t
2
r = 2 « ' + 2 * + ... t
t
(«x > 92 > •••)
będzie przedstawieniem binarnym liczby /•,. Dokonujemy teraz zamiany r skład ników b na parami różne składniki t
t
ą
bt 2 " , b 2 \ t
...
(zamiana ta zachowuje oczywiście sumę składników podziału). Powtarzając te operacje dla każdego /', 1 < i < p i porządkując składniki według nierosnącej wielkości otrzymujemy w rezultacie podział liczby n na parami różne składniki. Wynika to z faktu, iż każdą liczbę naturalną można jednoznacznie przedstawić w postaci iloczynu liczby nieparzystej przez potęgę dwójki. Dla przykładu p o każemy opisaną transformację dla podziału 26 = 7 + 5 + 5 + 3 + 3 + 1 + 1 + 1: 1
1
1
7 + 5 + 5 + 3 + 3 + 1 + 1 + 1 = 7-2° + 5 - 2 + 3 - 2 + l ( 2 + 2 ° ) = = 7 + 10 + 6 + 2 + 1 = 10 + 7 + 6 + 2 + 1 Łatwo zauważyć, że transformacji odwrotnej można dokonać, dla dowolnego podziału na parami różne składniki, przedstawiając każdy składnik j a k o p2*, gdzie p nieparzyste, grupując następnie składniki według „czynnika nieparzy stego" p i każdą taką grupę p2 ,p2 \ ... zamieniając na r = 2 + 2 + . . . składników równych p. Tak więc opisana transformacja określa wzajemnie jednoznaczną odpowiedniość pomiędzy podziałami n a składniki nieparzyste a podziałami na składniki parami różne. • Vl
q
9 l
, 2
Inne tego typu twierdzenia sformułowano w zadaniach 1.39 + 1.41. Pokażemy teraz prosty algorytm generowania wszystkich podziałów liczby. Będzie on generować podziały w porządku odwrotnym do leksykograficznego, tzn. podział n = Cj_+
...
+c
t
(1.53)
I
1
AjDZIAŁY LICZBY
5cdzic wygenerowany — niekoniecznie bezpośrednio — p o podziale n =
— +a
(1.54)
K
wtedy i tylko wtedy, gdy istnieje wskaźnik p < min (k, l) taki, że c < a oraz c = a,, dla 1 < p (por. rys. 1.14). Oczywiście pierwszym podziałem w tym uporządkowaniu jest podział na jeden składnik równy n, ostatnim natomiast podział n a n składników równych jedności. Zastanówmy się, j a k wygląda podział bezpośrednio następujący p o podziale (1.54). Poszukujemy podziału, który m a jak największą liczbę początkowych składników równych początkowym składni kom, podziału (1.54) — oznaczmy te składniki przez a ...,a _i — i którego pozostałe składniki określone są przez podział bezpośrednio następujący p o podzi&le j = a,+a, + + a . Łatwo zauważyć, że warunki te określają jedno znacznie p
u
+ x
f = max {i:
p
m
t
k
a > 1} t
Problem sprowadza się więc do znalezienia bezpośredniego następnika podziału 5
= flf + 1 + ... + 1 , fl
r
> 1
k — t razy
Nietllldno zauważyć, że podział taki ma postać V=s / + ... +l+(s
mod ł)
IM/U razy
gdzie / =
a,-\.
W algorytmie, który teraz opiszemy podział reprezentowany będzie przez zmienne S [ 1 ] , S \d~\ zawierające parami różne składniki podziału (S [1] > ... > S [ d ] ) oraz przez zmienne R [/], R [ 0) spełniający ten warunek określa jednoznacznie podział liczby n zawierający l składników równych i, 1 < / < n. Oznaczmy przez P (ri) liczbę podziałów liczby « na składniki nie przekra czające h. 1 (
u
t
h
TWIERDZENIE
1.23
Funkcja tworząca dla ciągu P (0), P (l), h
2
3
P (2), ... jest równa
h
2
4
h
6
2
3
( l + x + x + x + . . . ) ( l + x + x + x + . . . ) . . . ( l + x + x * + x " + ...) = 1
2
= (l-x)- (l~x )-
1
... ( l - x " ) -
1
DOWÓD
Zgodnie z definicją iloczyn h szeregów p o prawej stronie jest sumą składników 2X
h>h
postaci x*i x *... x (A, jest numerem wyrazu wybranego z /-tego szeregu). Współczynnik przy x" jest więc równy liczbie ciągów takich, że 1;
fc
k
£ iA, = n, a więc, zgodnie z naszymi poprzednimi uwagami, jest on rów»y W
•
.
W analogiczny sposób dowodzimy następującego twierdzenia: T
WIER£>
Z E N
,
1.24
E
Funkcja tworząca dla ciągu P(0), P(1),P(2), 2
3
2
4
6
... jest równa 2
3
( l + x + x + x + ...) ( l + x + x + x + . . . ) . . . ( l + x " + x * + x * + . . . ) . . . = 00
= /Ja-*") h=i
1
(1.62) •
Uwaga: W tym miejscu należałoby ściśle zdefiniować szereg określony przez nieskończony iloczyn szeregów F (x)-F (x). . . . Oznaczmy przez I„(x) „iloczyn częściowy" F (x)-F (x)...-F (x), oraz przez p najmniejszą niezerową potęgę o niezerowym współczynniku w F (x) (dla iloczynu (1.62) mamy p = ri). Załóżmy, że współczynnik przy zerowej potędze w każdym z szeregów F (x) jest równy jedności, oraz że lim p„ = oo (oba te założenia są spełnione dla iloczynu (1.62)). 1
1
2
2
n
n
n
n
n
Współczynnik przy x" w I (x) jest wtedy taki sam dla wszystkich m większych od pewnej liczby m„ (takiej, że p > n dla m > m„). Ten właśnie współczynnik przyjmujemy j a k o współczynnik przy x" w szeregu określonym przez iloczyn nie skończony F (x)-F (x).... Technika funkcji tworzących pozwala na prosty dowód niektórych własności podziałów liczby. Podamy dla przykładu inny dowód twierdzenia 1.21. Zauważ my w tym celu, że funkcja tworząca dla podziałów na parami różne składniki (tzn. dla ciągu r r , gdzie r jest liczbą podziałów liczby n na parami różne składniki) jest równa m
m
1
2
u
2
H
2
R(x)
3
= ( l + x ) ( l + x ) ( l + x ) ... ( l + x * ) ...
natomiast funkcja tworząca dla podziałów na nieparzyste składniki jest równa 1
N(x)
3
= (l-x)' (t-x )-
1
k
n
W
_
J - x ^
~
I^JC*
l-x
' l-x
2
1
1
...
2k
Korzystając z zależności l+x „
2k
... (l-x ~ )-
k
= (1 — x )/(l l-x
6
' l-x
—x)
_ 3
mamy
_ 1 _ _
""
_1_
l-x
l-x
1 3
' l-x
_ 5
.
•••~
i V
W
Podamy jeszcze dwa przykłady zastosowania funkcji tworzących. Pierwszy z nich dotyczy tzw. liczb Fibonacciego F . Liczby te są rozwiązaniem równania rekurencyjnego n
F„+i = F„ + F _ , n
n > l
1
(1.63)
z warunkami początkowymi f
0
= F , = l
(1.64)
Funkcja tworząca F(x)
dla ciągu F , F 0
00 F(x)
F , • •• spełnia równanie 2
00 k
= JJF x
= l+x+ £
k
00 = l+x
u
2
F , x - +x k 2
k=2
k
x
=
00 k 2
+x £
(F^+Ft-J
]?F -
k 1
X"-
1
=
k=2
2
2
= l+x+x F(x) + x(F(x)-l) = l+(x + x )F(x) Stąd otrzymujemy funkcję tworzącą dla liczb Fibonacciego F(x)
=
2
1
(l-x-x )-
2
znajdując pierwiastki równania 1 — x — x ^.(l~ax) (\-bx) gdzie /
=(l+ 5)/2,
fl
2
= 0 otrzymujemy rozkład 1 —x — x
=
6=(l-V5)/2
v
zastosujemy teraz metodę współczynników nieoznaczonych, aby znaleźć przed stawienie
!•
1 (l-ax){l-bx)
_
A l-ax
,.
J5 l-bx
_ A+B-(Ab + Ba)x {l-ax){l-bx)
porównując współczynniki w liczniku otrzymujemy A + B = 1, tzn. B — l — A, a zaiem J46 + (1 —^4) a = 0, co daje A = afca — b), B = —bj(a—b). T a k więc F{x)
1
1
= A(l-ax)- +B(l-bx)-
= N*+l
k
= A ^
k
ax
+B ^ b W
k=0
=
fc=0
i ostatecznie l
+
v
[l-y/S
M
t
,
(
L
6
5
)
Metoda ta przenosi się n a dowolne liniowe równania rekurencyjne o stałych współczynnikach (por. zad. 1.46). Jako ostatni przykład zastosowania funkcji tworzących wyznaczamy liczbę drzew binarnych o n wierzchołkach. Przez drzewo binarne o n wierzchołkach rozsuniemy drzewo puste T - 0 , jeśli n = 0 lub trójkę T = r , P > gdzie I , « L i » P - Oznaczmy przez c liczbę nieizomorficznych drzew binarnych o k wierzchołkach (por. rys. 1.16). Z podanych defi2
2
2
2
2
2
2
V 1
1.16 Drzewa binarne o k wierzchołkach, k = 1, 2, 3
x
x
k
x
2
nicji rekurencyjnych wynika, że c *= 1 oraz jeśli 0 < s < k, to istnieje dokład nie c c _inieizormoficznych drzew binarnych postaci 0
0
(1.66)
Nieizomorficzne drzewa binarne dla k = 0, 1, 2, 3 przedstawiono na rys. 1.16. Rozważmy funkcję tworzącą C(x)
= J £ c x*. Równość (1.66) przypomina s
fc =
0 2
bardzo wzór na współczynniki iloczynu Cauchy'ego C (x) C (x) = C (x), kładniej mówiąc spełnione jest równanie 2
C(x)
= xC (x)
do
+l
czyli
€> 2
xC (x)-C(x) + l = 0
(1.67)
Pokażemy teraz, że istnieje funkcja C (x) analityczna w otoczeniu zera spełnia jąca to równanie. N a mocy wspomnianej j u ż zachowującej działania wzajemnie jednoznacznej odpowiedniości między szeregami a funkcjami analitycznymi współczynniki tego rozwiązania określą szereg formalny spełniający równa-J nie°(1.67). Traktując (1.67) j a k o równanie kwadratowe o niewiadomej C(x) (wartości poszukiwanej funkcji analitycznej w punkcie x) otrzymujemy, dla x # 0, C(x)=
(1.68)
i 2
Rozwińmy Vi — 4x = (1— 4x) 2
-^Q.-4x)
w szereg Maclaurina. Dla k > 0 mamy i
l ' fi A l i A ll = — • f — - 1 1 _ - 2 ... \ — -k+1
) (l-4xy 1
= 2 * ( - l ) l - 3 - 5 - ... • ( 2 f c - 3 ) ( l - 4 * )
2
-Jk
*
a więc
N
I
«x
^
k l
V
Za
2*-(2fc--2)! * _ « _ , V fc!-2-4- ... -(2fc-2) * Z ;
vi i *=1
X
/2fc-2 N
(2k-2)! fc!(/ AJ
=
n
= ^ ^ • 1 -
2
\A nAj\+ t
1
... +(~ir~ \A n...nA \ l
n
•
Pokażemy teraz parę zastosowań zasady włączania-wyłączania. TWIERDZENIE
1.26
Jeśli \X\ = n, | F | = m, to liczba wszystkich funkcji z Z n a 7 (tzn. funkcji f: X -* -* Y takich, że / ( X ) = Y) jest równa m-
**.m = 2j
1
(
_ 1
M
l;
m
K -')"
0-72)
3A W Ł Ą C Z A N I A — W Y Ł Ą C Z A N I A
j§ph Y = {>>!, ych y $f (X).
y ). Oznaczmy przez A zbiór tych funkcji / : X-> Y, dla Wtedy oczywiście m
t
I
/(^)
t
y < > / 6
*
u
A, 1
ty, że wszystkich f u n k c j i / : Z - > 7 jest m" (twierdzenie 1.1), wystarczy więc czyć liczność sumy A u ... u A^. Zauważmy najpierw, że dla dowolnego x
l ^Pi
< ... < Pt ^ m przecięcie A
pi
i / : Z - > 7 takich, że j> , .-,y
Pi
i (m—p)", f
i
, y
p
]
i
n ... n A jest zbiorem wszystkich p (
$f(X),
a więc liczność tego przecięcia
tyle ile jest funkcji f:X->
Y\{y >
£ y możemy wybrać na
sposobów, a więc zgodnie z zasadą
Pi
•••>y ,}- Zbiór
i-elemento-
p
aia-wyłączania
m . « = ">"-! U A\ = m " - > t
'"°
f
&
(-1)'-
1
.
W
(m-i)" =
m-1
.fe'
I;
=^
< - i y (7)('"-0"
•
W i | t o zauważyć, że n a mocy wzoru (1.41) twierdzenie to dostarcza prostego w 4 t t t n a liczby Stirlinga drugiego rodzaju: \,
k-l S ( n
'
k )
(
iy
'kT "- T\\I! ~ { s
=
k=z
(
i
L
7
3
)
Itsaym zastosowaniem zasady włączania-wyłączania jest wyznaczenie liczby pod zbiorów ^-elementowych zbioru z powtórzeniami X = (k *a , 1
zie -wiemy tylko, że podzbiorów tych jest 7»+l-l\ \
^
gdy k
1
x
... ,k *a ) n
n
^na ra
= ...= k = 1, oraz n
\ I gdy k
k„ > k\ . Zauważmy, że problem ten jest równoważny
u
znalezieniu liczby rozwiązań całkowitych układu X i + ... + x „ = k O < X( < k dla i = 1, n ;
Metodę rozwiązania tego problemu zilustrujemy n a przykładzie. ( 4 * a 3*a , 7 * a ) , k = 11. Utwórzmy zbiory A = zbiór wszystkich podzbiorów A:-elementowych zbioru niami (Jc*a k*a , k*a ), A = zbiór tych Ye A, które zawierają więcej niż 4 wystąpienia A — zbiór tych Ye A, które zawierają więcej niż 3 wystąpienia A = zbiór tych Ye A, które zawierają więcej niż 7 wystąpień
Niech X =
8 8
1;
2
3
u
x
2
3
Ombinatoryka
2
z powtórze
3
elementu a elementu a , elementu a . u
2
3
/n + k-l\ /3 + l l - l \ /13\ M a m y \A\ = I ^ I= I \ — 1 1 = 78,
oraz
jest
oczywiste,
że
l ^ i l wynosi tyle, ile jest 6-elementowych (A;—5 = 6) podzbiorów zbioru z pow tórzeniami \A \ 2
=
(
3
(ll+au +
_
^
1
)
zauważyć, że
=
ll*a ,
ll*a ),
2
tzn. ^
3
= 36, | A | = (
Q
3 +
3
\A n A \ = ^ x
3 +
2
^
3
3+
1
^
~ ) =
3
*)~ (2)
=
^'
*j = ^
= 28,
= 10.
(3)
Łatwo
e
^
podobnie również
2-elementowych
(A:— 5 — 4 = 2) podzbiorów zbioru z powtórzeniami ( l l * a
1 ;
ll*a , 2
ll*a ), 3
oraz A n A = A r\ A = 0. Podzbiór Ye A jest podzbiorem zbioru z powtórzeniami X wtedy i tylko wtedy, gdy nie należy d o A A ani A , a zatem, zgodnie z zasadą włączania-wyłączania, szukana liczba podzbiorów A>elementowych zbioru z powtórzeniami X jest równa 2
3
t
3
lf
\A\ -\A \
2
3
- \ A \ - \ A \ + \A n A \ + \A n A \ + \A n A \- 1 ^ n A n A | = = 7 8 - 2 8 - 3 6 - 1 0 + 6 + 0 + 0 - 0 = 10
X
2
3
t
2
2
3
X
3
2
3
Ostatnim zastosowaniem zasady włączania-wyłączania, które pokażemy, jest wyznaczenie liczby nieporządków n a zbiorze n-elementowym. Przez nieporządek n a zbiorze {1, . . . , « } rozumiemy dowolną p e r m u t a c j ę / t e g o zbioru taką, ż e / ( / ) # / dla 1 < 1 < n. Oznaczmy przez D„ zbiór wszystkich nieporządków n a zbiorze (1, ń] oraz A
t
= {feS :
f(i)~i},
n
i»l,...,n
(przypomnijmy, że S„ oznacza zbiór wszystkich permutacji zbioru {1, . . . , « } ) . Permutacją / j e s t nieporządkiem wtedy i tylko wtedy, gdy nie należy d o żadnego ze zbiorów A , a zatem, w myśl zasady włączania-wyłączania t
RT
Z
IA.I = \S \n
(=1
1
\4nAj\-...
+ ( - l ) " - i ^ i n ... nA„\
KKJ jest inwolucją wtedy i tylko wtedy gdy jest typu 1^2* (X + 2), = n) oraz te dowolna permutacją jest złożeniem dwóch inwolucji. 1
n
n
n
3
l
2
l>la permutacji ( d ^ a„y definiujemy wektor inwersyjny jako ^d , ...,d y, gdzie d = |{/ < i: aj > a,}\. Udowodnij, że wektor inwersyjny wyznacza permutacje jednoznacznie. x
n
t
•
Udowodnij, że zbiór wszystkich permutacji parzystych tworzy grupę. '42 ^
Udowodnij, że algorytm 1.10 generuje wszystkie permutacje (w nieco innej kolejności), jeśli usunąć instrukcję P [ / ] : = : P\jn\ w wierszu 15. Niech / i > / 2 > •••»/.! będzie ciągiem permutacji generowanym przez tak zmodyfi kowany algorytm. Udowodnij, że ciąg n\ elementów / ^ ' ( O s / j " (')> ••• /~ jest dla każdego i (1 < / < n) taki sam z dokładnością d o cyklicz nego przesunięcia (por. [45]). 1
•
Udowodnij, że asymptotyczna wartość (dla n -* oo) średniej liczby transpozycji przypadających na każdą permutacje wygenerowaną przez algoOO 2k
rytm 1.10 jest równa cosh 1 = 1.543 ... (cosh x = £ x j(2k)\), k=0
w przypadku
1
algorytmu zmodyfikowanego tak j a k w poprzednim zadaniu wartość ta 00
wynosi natomiast sinh
2k+i
1 = 1.175 ... (sinh x =
x l(2k
+1)!).
k= 0
1.14 Udowodnij, że każdą z liczb O, ...,nl— 1 można jednoznacznie przedstawić n -1
w postaci j ~
d kl, gdzie O < d < /, przy czym ciągi d k
t
k
_
u
d
od-
x
powiadające kolejnym liczbom pojawiają się w porządku leksykograficznym. Podaj algorytm konstruowania ciągu {d ^. , d,y odpowiadają cego liczbie j . k
1
1.15 Wyeliminuj rekursję z algorytmu 1.11. Opisz taką realizację, w której liczba kroków potrzebnych do skonstruowania każdej następnej permutacji (nie tylko średnia wartość liczby kroków!) jest ograniczona przez stałą niezale żną od n. (Wskazówka: Rozważmy uporządkowaną leksykograficznie listę L„ wszystkich ciągów (c„, c >, gdzie 1 < c ^ /. Udowodnij, żej-ta trans pozycja dokonana przez algorytm 1.11 ma postać P\B[p, cj] ••=-P[p\, gdzie p = min [i: c < i}, a jest ./-tym ciągiem na liście L„. Kolejne ciągi na liście L„ można generować efektywnie reprezentując ciąg < c „ , c > przez ciąg < c „ , c > , gdzie c, = 1, jeśli c = i a c = c , w przeciwnym przypadku, oraz iiżywając stosu, którego aktualną zawarto ścią jest zawsze ciąg a b a , b , a , b taki, że 2
f
t
2
2
2
lt
ly
2
2
t
s
t
s
s
U {'•• a < / < b^} = {/: Ci < i} q
8= 1
Szczytowy
element stosu określa wspomniany poprzednio wskaźnik
p.
1.16 Napisz program realizujący „zwyczajną" wersję nierekurencyjną algoryt mu 1.11 oraz wersję sugerowaną w poprzednim zadaniu. Sprawdź empirycz nie przez wykonanie programu, czy ta ostatnia jest szybsza, jeśli idzie o śred ni czas potrzebny do skonstruowania każdej następnej permutacji. 1.17 Załóżmy, że dla każdego nieparzystego m mamy B \m, 1] = ... = = B [m, m — 1] = b°"\ oraz że dla dowolnego parzystego m > 4 ciąg B [ni, l ] , B [m, m — 1] spełnia jeden z następujących dwóch w a r u n k ó w : (i) Każdy spośród elementów 1, ..., m — 1 występuje w nim dokładnie raz, przy czym odległość między pozycjami zawierającymi m—l i o jest parzysta (odległość między pozycjami /, j rozumiemy j a k o \i—j\). (ii) Każdy spośród elementów zbioru {1, m — l}\{m— 1, wystę puje w nim dokładnie raz oraz element m—l lub ft występuje dwu krotnie, przy czym odległość między tymi wystąpieniami jest nieparzysta. Udowodnij, że procedura PERMiii) generuje wtedy wszystkie permu tacje elementów P [ l ] , P [ « ] , przy czym q>„ (p. dowód poprawności al gorytmu 1.11) jest transpozycją dla każdego nieparzystego « > 3 i cyklem długości n dla każdego parzystego n (por. poz. [44]). ( m - 1 )
(m_1)
JADANIA
j.18 Korzystając z poprzedniego zadania udowodnij, że następujące wersje procedury B(m, i) w algorytmie 1.11 prowadzą do poprawnego algorytmu generowania wszystkich permutacji: (1)
(2)
(3) (4) (5)
if (w mod 2 = 0) and (m > 2) then if / > 1 then B ••= m — i else B ••= m — 2 else B ••= m—l if m mod 2 = 0 then if (/ = 1) or (i — m — 1) then B ••= m — i else B := i else B ••= 1 if (m mod 2 = 0) and (/ > 2) then B ••= m—i else B-.= m-1 (*Wells [ 7 1 ] * ) if m mod 2 = 0 then B ••= i else B := 1 ( * H e a p [ 3 2 ] * ) if m mod 2 = 0 then B -.= i else B := m — 2
Jaką postać ma permutacją
+ ]*[«]«-*
k=0
(Wskazówka: W przypadku pierwszej tożsamości policz na dwa sposoby liczbę wszystkich funkcji r ó ż n o w a r t o ś c i o w y c h / : I - » P u 2 , gdzie \X\ = n, \P\ = p, \Q\ = q, P n Q = 0 . Dla drugiej tożsamości znajdź podobną interpretację w terminach rozmieszczeń uporządkowanych w p + q pu dełkach). 1.28 Udowodnij, że (x +x + i
2
gdzie {
...
"
+x
) = n\j(n \n \ l
2
... n \). Podać interpretację kombinatoryczp
ną współczynników. Czemu jest równe
i^ _^ kn
1.29 Podaj nierekurencyjną wersję generowania podzbiorów ^-elementowych opartą na wzorze (1.25). Pokaż, że zależność rekurencyjna G(n,k)
= G ( n - l , f c ) , G ( n - 2 , f c - 2 ) u { n - 1 , n}, G * ( n - 2 , fc-1) u {«}
określa również pewną listę podzbiorów ^-elementowych, w której są siednie podzbiory mało się od siebie różnią. Podaj algorytm nierekurencyjny oparty na tej zależności. 1.30 Pokaż, że krata podziałów nie jest rozdzielna, tzn. że na ogół u a (p v fi) ^ ¥= (n a a) v (71 a fi). Wskaż odpowiednie podziały iz, a, fi.
«/70
^ADANJA
...4/71
"
^j.31 Udowodnij, że liczba ciągów długości n o elementach ze zbioru A>elemenT towego, zawierających każdy element tego zbioru co najmniej raz jest równa k\ S (n, k). 1,32 Podział n zbioru n-elementowego Z jest typu 1 >2 *... n^ (gdzie X + 2X + ... +nX„ = ń), jeśli zawiera on X bloków /-elementowych, dla i = 1, . . . , « . Udowodnij, że liczba podziałów typu l >2 >... n jest równa n\/(X \ ... X
X
x
2
t
x
x
Xn
1
!
...A„!(1!)V..(«!/-). Oznaczmy dla każdego k ^ 0
Udowodnij, że
dx"
n
d
W )
Za
J
J =0
*, + *, + . . . + k„=J * + 2)[,+ ...+n*„ = n t ,*,,...,t„>0
W
fc ! 1
...fc„!(u !)*»
(1
1
1
Pokaż, że suma współczynników przy wszystkich składnikach postaci / (^ )* ••• (g T jest równa liczbie Bella B . 1.34 Udowodnij, że dla każdego m ^ 0 macierz liczb Stirlinga pierwszego r o dzaju [s(n, A:)] ,(c<m jest odwrotnością macierzy liczb Stirlinga drugiego rodzaju [S(n, A : ) ] l J$5 Udowodnij, że U)
|7TnU~) 2.4
I I
Listy incydencji ZA [«], ve
V o d p o w i a d a j ą c e g r a f o m z rys.
2.1
Przeszukiwanie grafu w głąb Istnieje wiele algorytmów grafowych, których ogólny szkielet polega na syste matycznym przeszukiwaniu wierzchołków grafu tak, by każdy wierzchołek był odwiedzony dokładnie raz. Dlatego też ważnym problemem jest znalezienie dobrych metod przeszukiwania grafu. Mówiąc najogólniej, metoda przeszuki wania jest „ d o b r a " jeśli (a) sującego (b) zmienia
pozwala na łatwe „zanurzenie" w niej algorytmu rozwiązywania intere nas problemu oraz każda krawędź grafu analizowana jest co najwyżej raz (lub, co nie istotnie sytuacji, liczbę razy ograniczoną przez stałą).
Opiszemy teraz tego typu metodę przeszukiwania grafu niezorientowane go, będącą jedną z fundamentalnych technik projektowania algorytmów grafo wych. Metodę tę nazywamy przeszukiwaniem w głąb (ang. depth first search [66]) dla przyczyn, które — mamy nadzieję — wkrótce staną się jasne. Ogólna idea tej metody jest następująca. Przeszukiwanie zaczynamy od pewnego ustalonego wierzchołka v . Następnie wybieramy dowolny wierzcho łek u sąsiadujący z v i rozpoczynamy nasz proces od u. Ogólnie, przypuśćmy, że znajdujemy się przy wierzchołku v. Jeśli istnieje nowy (jeszcze nie odwiedzony) wierzchołek u, v—u, to odwiedzamy ten wierzchołek (przestaje on być nowy), i zaczynając od niego kontynuujemy przeszukiwanie. Jeśli natomiast nie istnieje żaden nowy wierzchołek sąsiadujący z v, to mówimy, że wierzchołek v został wykorzystany, cofamy się d o wierzchołka, z którego doszliśmy d o v, i proces kontynuujemy (jeśli v = v , to przeszukiwanie jest zakończone). Innymi słowy, przeszukiwanie w głąb z wierzchołka v polega na przeszukiwaniu w głąb ze wszy stkich nowych wierzchołków sąsiadujących z v. 0
0
0
Można to łatwo zapisać za pomocą następującej procedury rekurencyjnej: 1
2 3 4 5
procedurę WG(v); (* przeszukiwanie w głąb z wierzchołka v; zmienne NOWY, ZA są globalne *) begin odwiedź v; NOWY\y~\ ••= false; for ueZA\v\ do if NOWY[u] then WG (u) end (* wierzchołek v został wykorzystany *)
Przeszukiwanie w głąb dowolnego, niekoniecznie spójnego grafu odbywa się zgodnie z następującym algorytmem: 1 2 3 4 5
begin for v e V do NOWY\p\ •.= true; (* inicjalizacja *) for v e V io if NOWY[ti] then WG (ii) end
2
/78^
t E S Z U K I W A N I E
G
R
A
F
U
W GŁĄB
emy teraz, że algorytm ten odwiedza każdy wierzchołek dokładnie raz, jego złożoność jest O (n+m). Zauważmy najpierw, że wywołanie WG (v) jJŁoduje odwiedzenie wszystkich wierzchołków składowej spójnej grafu za^Jprającej v (jeśli NOWY [u] = true dla każdego wierzchołka u tej składowej), ^ i j p k a t o bezpośrednio ze struktury procedury WG: p o odwiedzeniu wierzchoł^ p w i e r s z 2) następuje wywołanie procedury WG dla wszystkich jego nowych i d ó w (wiersz 3), a tym samym odwiedzenie wszystkich poprzednio nieodwieftych sąsiadów. Zauważmy jeszcze, że każdy wierzchołek jest odwiedzany co yżej raz, gdyż odwiedzony może być jedynie wierzchołek v, dla którego Y\v\ = true, natomiast natychmiast p o odwiedzeniu tego wierzchołka p m y w a n a jest instrukcja NOWY\y\ := false (wiersz 2). r
j | N a s z algorytm rozpoczyna przeszukiwanie kolejno od każdego jeszcze nieizonego wierzchołka, a zatem odwiedzane są wszystkie wierzchołki grafu jfoniecznie spójnego). H.'Aby oszacować złożoność obliczeniową algorytmu zauważmy najpierw, że licSa kroków w obu pętlach (wiersze 2 i 3) jest rzędu n, nie licząc kroków wy konywanych przez wywołania procedury WG. Procedura ta wywoływana jest co nalftyżej « razy w drugiej pętli, oraz p o odwiedzeniu każdego z wierzchołków, dlfffcażdego z jego nowych sąsiadów, w sumie O (n+m) razy. Całkowita liczba krjpów wykonywanych przez pętlę w wierszu 3 procedury WG (nie licząc kroków wjjlMiywanych przez WG («)), dla wszystkich wywołań tej procedury, jest rzędąpi, liczby krawędzi. Daje t o całkowitą złożoność algorytmu O (n + m). A" Zauważmy, że algorytm przeszukiwania w głąb dowolnego grafu można łatwo ziajsdyfikować tak, by wyznaczał on składowe spójne tego grafu. Odnotujmy ten fagi: WNIOSEK 2.2 SJtpdowe spójne dowolnego grafu reprezentowanego przez listy incydencji-można wjtoaczyć w czasie O (n + m). • Ze względu n a dużą rolę przeszukiwania w głąb w projektowaniu algorytmów Stpbwych podamy jeszcze nierekurencyjną wersję procedury WG. Rekursję hWnujemy w standardowy sposób, przez użycie stosu (por. n p . [1]). Każdy od*>6ozany wierzchołek jest kładziony n a stos oraz zdejmowany ze stosu, gdy zoJ C wykorzystany. s
e
S T A
1
procedurę
WGl(v);
(* przeszukiwanie grafu w głąb z wierzchołka v — wersja nierekurencyjną procedury WG; zakładamy, że na początku procesu przeszukiwania P [ « ] = wskaźnik d o pierwszego rekordu listy ZA[u] dla każdego wierz chołka w; tablice P , NOWY są globalne * ) fcegiu STOS 0 ; STOS ; NOWY[v] == false; % while STOS # 0 do
2
2.2/79
4
begin t — top(STOS); (* t = szczytowy element stosu *) (* znajdź pierwszy nowy wierzchołek na liście ZA\f\ *) if P [ r ] = nil then b •.- false else b — not J V t W y [ P [r]T.wVrzcn]; while i do
5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
begin P [ < ] := P [ r ] t « a ^ ; if = nil then b ••= false else b := not NOWY[P[t~\ '[.wierzch] end; if # nil then (* nowy wierzchołek znaleziony *) begin t ••= i>[r] \.wierzch; STOS WGN [u] > 0 i u nie znajduje się bezpośrednio pod elementem szczytowym stosu), t o wierzchołek u — na mocy twierdzenia 2.4 — znajduje się n a stosie i cykl zamknięty przez krawędź {v, u} reprezentowany jest przez szczytową partię stosu, aż do wierzchołka u. ALGORYTM 2.9 (Znajdowanie zbioru cykli fundamentalnych grafu) D a n e : G r a f G = < F , E} reprezentowany przez listy incydencji ZA [v], ve V. Wyniki: Zbiór cykli fundamentalnych grafu G. 1
2 3 4 5 6 7 8 9 10 11 12 13 14 15
procedurę CYKLE (v); (* znajdowanie fundamentalnego zbioru cykli dla składowej zawierającej wierzchołek v; zmienne d, num, STOS, ZA, WGN są globalne *) begin d := d+1; STOS^ v; num ••= num+1; WGN[v] = num; for u e ZA\y\ do if WGN[u] = 0 then CYKLE(u) else if (u ^ STOS[d-\~\) and (WGN\v\ > WGN\u~\) then (* {v, u} zamyka nowy cykl *) wypisz cykl o wierzchołkach STOS [d], STOS \d-1],..., STOS [ c ] , gdzie STOS [c] = u; d-=d—l (* wykorzystany wierzchołek i; jest zdejmowany ze stosu *) end; (* CYKLE *) begin (* program główny *) for v e V do WGN[v] 0; num ••= 0; (* inicjalizacja *) d := 0; STOS[0] ••= 0; (* d = liczba elementów na stosie *) for v e V do if WGN\v\ = 0 then CYKLE(v) end
szacujemy teraz złożoność obliczeniową tego algorytmu. Zauważmy najpierw, całkowita liczba kroków, nie licząc wypisywania cykli (wiersze 6, 7) jest — tak we wszystkich algorytmach opartych na przeszukiwaniu w głąb — O (n + m). jjD tego należy dodać sumaryczną długość wszystkich cykli. Długość ta nie przekracza (m—n+\)n, co daje całkowitą złożoność algorytmu 0(nm + ri) (lub Q(flm), jeśli odrzucimy zdegenerowany przypadek m = 0).
znajdowanie składowych dwuspójnych wierzchołek a grafu niezorientowanego G = < F , E} nazywamy punktem arlykulacji, jeśli usunięcie tego wierzchołka i wszystkich incydentnych z nim kra wędzi powoduje zwiększenie liczby składowych spójnych grafu. Równoważnie jańżemy powiedzieć, że a jest punktem artykulacji, jeśli istnieją wierzchołki u, v f<j|tae od a takie, że każda droga z u do v — a zakładamy, że istnieje co najmniej jedna taka droga — przechodzi przez wierzchołek a. Graf niezorientowany na zywamy dwuspójnym, jeśli jest on spójny i nie zawiera punktów artykulacji. Dowolny maksymalny podgraf dwuspójny grafu G nazywamy składową dwuspójną, albo blokiem tego grafu. W niektórych zastosowaniach dwuspójność grafu jest cechą bardzo pożą daną. Wyobraźmy sobie na przykład, że wierzchołki grafu reprezentują węzły pewnej sieci informacyjnej, a krawędzie odpowiadają liniom przesyłowym. Jeśli nasz graf jest dwuspójny, to awaria pojedynczego węzła w nie powoduje nigdy utraty połączenia między żadnymi dwoma węzłami różnymi od iv. Znajomość bloków grafu jest też ważna ze względu na fakt, że wiele zagadnień grafowych — talach jak znalezienie wszystkich cykli elementarnych lub też stwierdzenie czy graf jest płaski (tzn. daje się narysować na płaszczyźnie tak, by żadne dwie kra wędzie się nie przecinały) — sprowadza się w naturalny sposób do analogicz nych problemów dla bloków danego grafu. Zauważmy, że jeśli < F B }, (V , B } są dwoma różnymi blokami grafu G, V n V = 0 albo V n V = {a}, gdzie a jest punktem artykulacji grafu G. Istotnie, rozważmy podgraf (V u V , B u B }. Gdyby \Vn V \ > 2, to pod8raf ten byłby dwuspójny, wbrew założeniu o maksymalności < V , B ) i < V , B }. Również przypadek V n V = {a}, gdzie a nie jest punktem artykulacji grafu G, Jest niemożliwy. Wtedy bowiem istnieje w G droga między wierzchołkami w e V a oraz v e V , v # a, nie zawierająca wierzchołka a. Nietrudno zauważyć, & podgraf powstały z < F u V , B u B } przez dodanie wierzchołków i kra wędzi tej drogi jest dwuspójny, wbrew założeniu o maksymalności < F B,} (^2, B }. Przykład grafu, jego punktów artykulacji i bloków przedstawiono y s . 2.8. Znajdowanie punktów artykulacji i bloków grafu jest klasycznym proble. który można efektywnie rozwiązać przez zanurzenie w procedurze prze r w a n i a w głąb (p. Tarjan [66]). Zanim podamy szczegółowy algorytm, P^Zynimy najpierw parę wstępnych obserwacji. l 5
x
2
2
t o
x
2
t
2
t
2
x
2
2
{
x
L
2
2
2
u
u
2
X
2
t
2
l 3
1
2
n a
r
1 > l e i n
TWIERDZENIE
2.10
Niech D = < V, T} będzie drzewem rozpinającym o korzeniu r, spójnego gra fu G = 1). IYTM 2.11 (Znajdowanie składowych dwuspójnych grafu) Graf G = (V, E}
f
bez wierzchołków izolowanych,
reprezentowany
przez listy incydencji ZA [»], ve V.
Wyniki: Zbiory krawędzi wszystkich składowych dwuspójnych. 1 ' procedurę DWUSP(v,p); (* przeszukuj w głąb z wierzchołka v zakładając, że p jest ojcem wierz chołka v w t y m procesie, oraz wypisz krawędzie znalezionych składowych dwuspójnych; zmienne num, L, WGN, STOS są globalne * ) 2 * begin num ••= num+1; WGN[v~\ ••— num; 3 £ [ » ] := WGN\y\; 4 for ueZA[v\ do 5 if JFC/V[w] = 0 then (* wierzchołek w jest nowy, {v, u} jest gałęzią *) 6 begin STOS WGN[v~\ then (* v jest korzeniem lub p u n k t e m artykulacji, a szczytowa partia stosu, aż d o {v, u} włącznie, zawiera składową dwuspójną * ) 9 begin ( * wypisz krawędzie składowej dwuspójnej * ) repeat e , i utwórzmy graf G* przez dodanie dodatkowego wierzchołka t i krawędzi {u, t}, {v, t} (lub p o p r o {«, v) jeśli {u, v}£E). Wtedy G* jest grafem spójnym bez wierzchołków Ropnia nieparzystego, a drogi Eulera w G są w oczywistej wzajemnie jednoz n e j odpowiedniości z cyklami Eulera w G*. Z tego względu w pozostałej C? ^ c i tego punktu zajmować się będziemy wyłącznie cyklami Eulera. sto
S t u
Z n a c
ALGORYTM 2 . 1 3 (Znajdowanie cyklu Eulera) Dane:
Graf spójny G = < V, 2s> bez wierzchołków stopnia reprezentowany przez listy incydencji ZA [ u ] , ve V.
nieparzystego,
Wyniki: Cykl Eulera reprezentowany przez ciąg wierzchołków na stosie CE
1 2 3 4 5 6
begin STOS-.= 0 ; C £ . = 0 ; v := dowolny wierzchołek grafu; STOS 1, j a k o że n
nln
> ln/2Ji"/
2J
=
1
2110
2
a "' *^"! *
Opiszemy teraz ogólną technikę pozwalającą na znaczną redukcję liczby kroków w algorytmach typu pełnego przeglądu wszystkich możliwości. Aby tę technikę zastosować szukane rozwiązanie musi mieć postać ciągu < x , ..., x„>. Główna idea metody polega n a tym, że nasze rozwiązanie konstruujemy stopniowo, rozpo czynając od ciągu pustego E (długości 0). Ogólnie, mając dane rozwiązanie czę ściowe (x . . . , X ( > staramy się znaleźć dopuszczalną wartość x , co do której nie możemy od razu wykluczyć, że < X i , x , x } daje się rozszerzyć do pew nego rozwiązania (lub już nim jest). Jeśli taka dopuszczalna, jeszcze nie wyko rzystana wartość x istnieje, to dodajemy ją do naszego rozwiązania częścio wego i kontynuujemy nasz proces dla ciągu < x x , x }. Jeśli nie, to powra camy do rozwiązania częściowego {x , . . . , * ; _ ! > i kontynuujemy nasz proces poszukując nowej jeszcze nie wykorzystanej dopuszczalnej wartości x\ — stąd nazwa „algorytm z powracaniem" (ang. backtracking). x
lt
t
t
+
l
i + 1
t + 1
1 ;
t
i+1
x
Mówiąc dokładniej zakładamy, że dla każdego k > 0 jest dany pewien usta lony zbiór A , z którego wybierać będziemy kandydatów na A;-tą współrzędną k
• z w i ą z a n i a częściowego. Oczywiście zbiory A muszą być tak określone, by dla •kżdego rozwiązania całkowitego < x ...,x„> naszego problemu oraz dla każmgo k < « zbiór A zawierał element x (w praktyce nie możemy na ogół wy l i c z y ć sytuacji, w której zbiór A zawiera pewne „ z b ę d n e " elementy, nie wyJJfcpujące n a fc-tej współrzędnej żadnego rozwiązania całkowitego). Zakładamy • w n i e ż istnienie pewnej prostej funkcji, która dowolnemu rozwiązaniu częścioimu <Xi, ..., Xi) przyporządkowuje wartość P ( x •••,x ) (true lub false) tak, jeśli P (x Xi) = false, to ciągu (x x > na pewno nie da się rozszerzyć i rozwiązania. Jeśli ..., Xi) = true, to mówimy, że wartość Xj jest dok
1 ;
k
k
k
1 ;
u
1;
i
(
szczalna (dla rozwiązania częściowego (x •••,x _ y) — nie oznacza to byjmniej, że < x x _ ! > na pewno rozszerza się do pełnego rozwiązania, oces ten możemy zapisać w postaci następującego schematu: u
1 ;
i
i
(
begin fc:=l; i
| I 6 | $ 9 10 11 t
while k > 0 do if istnieje jeszcze niewykorzystany element y e A taki, że P(X[l],X\k-l\,y) then begin X[k] ••= y; (* element y został wykorzystany *) if (X [ 1 ] , X [k]} jest rozwiązaniem całkowitym then write ( ^ [ 1 ] , X[k]); k-.= k+l end else (* powrót do krótszego rozwiązania częściowego; wszystkie elementy zbioru A stają się znowu niewykorzystane *) *:=fc-l end k
k
12 13
Algorytm ten znajduje wszystkie rozwiązania, jeśli tylko założyć, że zbiory A s | skończone i istnieje n takie, że P ( x , x„) = false dla wszystkich x e sA , x e A (ten ostatni warunek oznacza, że wszystkie rozwiązania są długości mniejszej od n). Pokażemy nieco ogólniejszą własność: k
x
x
n
x
n
Niech s > 0 i niech < x . . . , x _ ! > będzie pewnym rozwiązaniem częścio wym skonstruowanym przez algorytm. Rozważmy pierwszą iterację pętli 3, dJa której k = s, X[i~] = x 1 i s. Począwszy od tej iteracji algorytm ge neruje wszystkie rozwiązania całkowite będące rozszerzeniem ciągu < x , x _ > dochodzi do stanu, w którym k = s—l. 1;
s
h
Ł
s
Ł
1
Oczywiście dla s = 1 własność powyższa wyraża p o prostu poprawność ^gorytmu. Ogólnej postaci tej własności dowodzimy przez indukcję („wstecz") Względem s. Jest ona prawdziwa dla s = n, gdyż nie istnieją żadne elementy do puszczalne dla x _ > , i wykonuje się od razu drugi człon instrukcji wa^ n k o w e j w wierszu 11, tzn. zmienna k przybiera wartość s—l. Załóżmy teraz Prawdziwość naszej własności dla pewnego s > 1. Pokażemy jej prawdziwość dla J — 1 . Niech < x x - > będzie dowolnym rozwiązaniem częściowym skons
u
1
ł
Komblnatoryka
1
3
2
struowanym przez algorytm i rozważmy pierwszą iterację pętli 3 , dla której k = = s—l, X\f] = x , 1 1. Jeśli istnieje element y dopuszczalny dla <x , Xj_ >, to konstruowane jest rozwiązanie częściowe (x , . v _ , y} (wiersz 6 ) i zmienna k przybiera wartość s (wiersz 9 ) . Następnie, zgodnie z na szym założeniem indukcyjnym, następuje wygenerowanie wszystkich rozwiązań będących rozszerzeniem ciągu < x , . . . , x _ , y} i dochodzimy d o stanu, w któ rym k = s—l, p o czym proces powtarzany jest dla następnego niewykorzysta nego elementu y dopuszczalnego dla < x x _ > , aż d o momentu wyczerpania wszystkich takich elementów (sytuacja taka może wystąpić od razu na samym początku). Zmienna k zmniejszana jest wtedy o 1 i osiąga wartość s—2 (wiersz 12). Z powyższych rozważań wynika, że algorytm poprawnie generuje wszystkie rozwiązania będące rozszerzeniem ciągu (x x _ > , co kończy dowód kroku indukcyjnego. Udowodniona przez nas własność bezpośrednio prowadzi d o następującej prostej i przejrzystej wersji rekurencyjnej schematu algorytmu z powracaniem: t
t
2
L
x
s
s
2
u
2 3 4 5 6 7 8 9
2
2
1 (
1
s
s
2
procedurę AP(k); (* generowanie wszystkich rozwiązań będących rozszerzeniem ciągu X [ l \ , X \ k - l \ ; tablica X jest globalna *) begin for yeA takich, że P(X[l~\,X[k-l\y) do begin X[k~] ~ y; if ^ [ 1 ] , X [ k ] jest rozwiązaniem całkowitym then write (X[l],X[k]); AP(k+l) end end k
Wygenerowanie wszystkich rozwiązań całkowitych możemy spowodować przez wywołanie AP ( 1 ) . Prezentację algorytmu z powracaniem rozpoczęliśmy od nieco bardziej skomplikowanej nierekurencyjnej wersji jedynie dlatego, że w wersji rekurencyjnej „powracanie" nie występuje w jawnej postaci, będąc częścią im plementacji mechanizmu rekursji. Zastosujemy teraz algorytm z powracaniem do znajdowania cykli Hamil tona w grafie G = {V, £ > . Każdy taki cykl możemy reprezentować przez ciąg (x , x , x ,>, przy czym A-, = x„ = v , gdzie v jest pewnym ustalo nym wierzchołkiem grafu, x , - — d l a 1 < / < n, oraz .r,- ¥= Xj dla 1 < i < < j < n. Zgodnie z tymi warunkami możemy przyjąć: L
2
n+
+1
0
0
=V
A
k
P(x
u
. . . , x . „ ) » ) o j e Z X O t - j ] A y Ć{x,, ••••A-, t
.I
ALGORYTM 2 . 1 4 (Znajdowanie wszystkich cykli Hamiltona w grafie) Dane:
Graf G = (V, E) reprezentowany przez listy incydencji ZA [t>], v e V.
Wyniki: Lista wszystkich cykli Hamiltona grafu G.
2
/98
LGORYTMY Z POWRACANIEM
I i. i M
^
2.s/99
procedurę HAMTLT(k); ( * generowanie wszystkich cykli Hamiltona będących rozszerzeniem ciągu <X[1], * [ / t - l ] > ; tablica X jest globalna * ) D E
8'
N
?
|> 4 5 $ i %
for yeZA[X[k-lJ] do if (k = n + 1) and O = rO) then w / t e ( ^ [ l ] , X [ i i ] , v0) else if DOP[y] then begin X[k] -.= y; DOP[y] ••= false; HAMILT(k+\); ~DOP[y] := true M.\ end ] | , end; (* HAMILT *) tV begin ( * p r o g r a m główny * ) ]g for D e F do DOP\y~\ ••= true; ( * inicjalizacja * ) 13 - ^ [ 1 ] — ^0; ( * ^0 = dowolny ustalony wierzchołek grafu * ) 14' DOP[v$\ == false; 15' HAMILT(2) lj|j end :
-i Opalanie tego, j a k również dowolnego algorytmu z powracaniem, można zilWftrować j a k o proces przeszukiwania pewnego drzewa. Każdy wierzchołek 4$$wa odpowiada w naturalny sposób pewnemu ciągowi (x , x >, przy czym fljjirzchołki odpowiadające ciągom postaci < x x , y} są synami tego wierzchi#ka (korzeń odpowiada ciągowi pustemu e). Rozważmy „pełne" drzewo D z l ^ o n e ze wszystkich możliwych ciągów postaci < x ...,x }, gdzie 0 < k < n i J£ e A dla 1 ^ i «C k, oraz załóżmy chwilowo, że każdy element y e A jest dopuszczalny dla < r jeśli A: < /z, oraz żaden element nie jest dopusz czalny dla < x ...,.\'i_]>, jeśli k > n; innymi słowy t
1 ;
fe
k
j 5
t
k
k
! ;
1 ;
Jtruc P(x ,...,X l
k
U
X ) k
=
J
F
A
,
S
E
jeśli J
E
Ś
L
;
k ;|
(*ie /l; dla 1 < /' < k). Nietrudno wtedy zauważyć, że wywołanie AP(l) spowo duje przeszukanie w głąb całego drzewa D (poczynając od korzenia e). W przy padku mniej trywialnej funkcji P określającej dopuszczalność wierzchołków pro ces przeszukiwania „opuszcza" rozpatrywanie wierzchołków poddrzewa o k o rceniu w każdym napotkanym wierzchołku „niedopuszczalnym" (tzn. odpowia dającym ciągowi x ), dla którego P (x , x ) = false). N a tym właśnie Polega efektywność algorytmu z powracaniem w stosunku do pełnego przeglądu ^'Szystkich możliwości. Zilustrowano t o , dla algorytmu 2.14, n a rysunku 2.11. k
t
k
Należy zaznaczyć, że w większości zastosowań liczba kroków algorytmu Powracaniem, choć mniejsza n a ogół niż dla pełnego przeglądu, rośnie jednak * najgorszym przypadku wykładniczo ze wzrostem wymiaru problemu. Tak jest "•wet w przypadku, gdy poszukujemy tylko jednego, a nie wszystkich rozwiązań z
R Y S . 2.11 Graf i drzewo ilustrujące a l g o r y t m z p o w r a c a n i e m z n a j d o w a n i a wszystkich cykli H a m i l t o n a w t y m grafie
(wtedy p o prostu przerywamy wykonywanie algorytmu p o osiągnięciu pierwszego rozwiązania; zauważmy, że gdy problem nie ma żadnych rozwiązań, modyfi kacja ta nie ma wpływu na przebieg wykonywania algorytmu).
Zadania 2.1
Udowodnij, że dla dowolnego grafu niezorientowanego macierz sąsiedztwa wierzchołków B wyraża się przez macierz incydencji A w następujący sposób: B = AA — diag [d d„] gdzie A jest macierzą transponowaną względem A, d jest stopniem /-tego wierzchołka, diag \d d ] zaś jest macierzą wymiaru n xn o elementach d ...,d„ na głównej przekątnej i zerach poza główną przekątną. Określmy dla dowolnego grafu niezorientowanego macierz sąsiedztwa kra wędzi C = [c ], gdzie Cu = 1, jeśli /-ta i y-ta krawędź są incydentne ze wspólnym wierzchołkiem, lub c = 0 w przeciwnym przypadku (przyjmujemy c = 0). Jak można wyrazić macierz C przez macierz incydencji? Czy ma cierz sąsiedztwa krawędzi wyznacza graf z dokładnością do izomorfizmu? T
1;
T
t
u
n
u
2.2
u
tj
u
2.3
Podaj szczegółową realizację list incydencji i procedur usuwania i dodawania krawędzi w czasie ograniczonym przez stalą (należy pamiętać, że przy usu waniu krawędzi {w, v) trzeba usunąć odpowiednie elementy z obu list ZA [ii] i ZA [v] — zakładamy, że wskaźnik do jednego z tych elementów jest dany j a k o parametr procedury).
2.4
Napisz procedury przejścia pomiędzy każdą parą sposobów reprezentacji grafu opisanych w punkcie 2.1 oraz oszacuj złożoność obliczeniową za proponowanych procedur. Niektóre algorytmy grafowe używają jedynie 0 ( n ) , lub przynajmniej
2.5
00
2.9/101
•ANIA
2
0(n + m), spośród n elementów macierzy sąsiedztwa wierzchołków B. Jednakże na początku algorytmu zwykle następuje inicjalizacja wszystkich elementów macierzy B, przez co złożoność algorytmu jest automatycz nie Q (ń ). Podaj sposób uniknięcia tej kosztownej inicjalizacji. (Wskazówka: Dla każdego elementu b użytego p o raz pierwszy przez algorytm umiesz czamy na stosie wskaźnik do tego elementu, oraz umieszczamy przy b wskaźnik do w ten sposób nowo utworzonego elementu stosu. Aby spraw dzić, czy dany element b był już inicjalizowany wystarczy zbadać, czy wskaźnik przy b prowadzi do wskaźnika na stosie określającego powrót 2
u
u
u
u
do b ) [1]. 2.6 Podaj algorytm o złożoności 0 ( « ) badania czy dany graf zorientowany reprezentowany przez macierz sąsiedztwa wierzchołków zawiera wierz chołek, do którego dochodzą krawędzie ze wszystkich pozostałych n - 1 wierzchołków, i od którego nie odchodzi żadna krawędź (algorytm taki pokazuje, że warunek (c) jest istotny w twierdzeniu 2.1). 2.7 Zbadaj technikę różniącą się od przeszukiwania wszerz jedynie tym, że nowo osiągnięte wierzchołki umieszczane są na stosie (algorytm taki opi sany jest dokładnie przez procedurę WS, w której KOLEJKA została za stąpiona przez STOS) [35]. 2.8 Zbadaj technikę przeszukiwania grafu, w której odwiedzone, lecz jeszcze niewykorzystane wierzchołki gromadzone są w kolejce, i którą dokładniej opisać można w następujący sposób: Badamy ostatni (najpóźniej umiesz czony) wierzchołek v kolejki (początkowo jest nim dowolny wierzchołek grafu). Jeśli istnieje nowy wierzchołek ueZA [i>], to umieszczamy go na końcu kolejki i powtarzamy powyższy proces aż do momentu gdy umiesz czony w kolejce wierzchołek nie ma nowych sąsiadów (fragment ten przy pomina przeszukiwanie w głąb). Następnie badamy pierwszy (najwcześniej umieszczony) wierzchołek kolejki. Jeśli istnieje nowy sąsiad tego wierz chołka, to umieszczamy go na końcu kolejki i powtarzamy dla niego opi sany powyżej proces typu przeszukiwania w głąb. W przeciwnym przypadku pierwszy wierzchołek kolejki jest wykorzystany i usuwamy go z kolejki, a na stępnie rozpatrujemy następny znajdujący się za nim wierzchołek. Cały proces kontynuowany jest aż do momentu, gdy kolejka staje się pusta. Podaj szczegółową implementację tej techniki. tJ
2-9
Udowodnij, że poniższa procedura odwiedza każdy wierzchołek spójnego dokładnie raz. procedurę PRZESZUKIWANIE^); (* początkowo STATUS\v\ — nowy dla każdego r e V *) begin odwiedź r; STATUS[r~\ ••= odwiedzony; while istnieje w V wierzchołek odwiedzony do begin v ••= dowolny wierzchołek odwiedzony; if istnieje nowy u e ZA [ r ] then
grafu
begin u ••= pierwszy nowy wierzchołek listy odwiedź u; STATUS[it] •.= odwiedzony
ZA[y];
end else STATUS[v]
—
wykorzystany
end end Pokaż, że przeszukiwanie w głąb i wszerz j a k również techniki opisane w za daniach 2.7 i 2.8 można opisać j a k o szczególne przypadki tej procedury. 2.10 Niech D — 1. (Wskazówka: Rozważ graf, którego wierzchołki odpowiadają ciągom binarnym długości n — l, krawędź natomiast każda odpowiada ciągowi binarnemu długości n, przy czym krawędź b ... b prowadzi zb ... b„_ dob ... b . Udowodnij istnienie drogi Eulera w takim grafie) [ 8 ] . x
t
1
2
n
n
2.21 Zmodyfikuj podany w punkcie 2.8 schemat algorytmu z powracaniem tak, by wyznaczał on jedno rozwiązanie zamiast wszystkich. 2.22 Udowodnij, poprzez wskazanie odpowiednich grafów, że liczba kroków wykonywanych (w najgorszym przypadku) przez algorytm 2.14 rośnie wy kładniczo ze wzrostem n. 2.23 Zastosuj algorytm z powracaniem do rozwiązania następujących problemów: (a) Znalezienie rozmieszczenia 8 wzajemnie nieatakujących się hetmanów na szachownicy. (^b)J)Znalezienie kliki o maksymalnej liczności w grafie niezorientowanym. (Kliką nazywamy dowolny podzbiór wierzchołków, w którym każda para różnych wierzchołków połączona jest krawędzią grafu). (c) Znalezienie pokolorowania wierzchołków grafu minimalną liczbą ko lorów tak, by żadna krawędź nie łączyła dwóch wierzchołków tego sa mego koloru. (d) Dla danych liczb całkowitych a ...,a,„b znalezienie zbioru indek sów {1, . . . , « } takiego, że £cij — b, jeśli taki zbiór / istnieje. u
(e) Stwierdzenie czy dane dwa grafy są izomorficzne.
Znajdowanie najkrótszych dróg w grafie
Pojęcia wstępne W rozdziale tym będziemy rozważać grafy zorientowane G = < V, E} o krawę dziach z wagami. Oznacza to, że każdej krawędzi <w, i>> e E jest przyporządkowa na pewna liczba rzeczywista a (u, v) zwana wagą tej krawędzi. Przyjmujemy dodatkowo a (u, v) = co, jeśli u •+-> v. Jeśli ciąg wierzchołków v , v ,..., 0
L
v
p
(3.1)
określa drogę w G, to jej długość definiujemy j a k o p
=i (Zauważmy, że przyjmując w dowolnym grafie wagę każdej krawędzi równą jedności otrzymujemy zwykłą definicję długości drogi w sensie liczby krawędzi; podobnie j a k poprzednio przyjmujemy, że długość drogi wynosi 0 dla p = 0). Interesować nas będzie znalezienie najkrótszej drogi między ustalonymi wierz chołkami s,teV. Długość takiej najkrótszej drogi będziemy oznaczać przez d (s, t) i będziemy nazywać odległością od s do t (tak określona odległość może być ujemna). Jeśli nie istnieje żadna droga od s do t, to przyjmujemy d (s, t) = co. Zauważmy, że jeśli każdy cykl naszego grafu m a dodatnią długość, to najkrótsza droga jest zawsze drogą elementarną, tzn. w ciągu (3.1) nie ma powtórzeń. Z dru giej strony, jeśli istnieje w grafie cykl ujemnej długości, to odległość pomiędzy niektórymi parami wierzchołków jest nieokreślona, gdyż obchodząc ten cykl dostateczną liczbę razy możemy wskazać drogę pomiędzy tymi wierzchołkami o długości mniejszej od dowolnej liczby rzeczywistej. W takim przypadku można by pytać o długość najkrótszej drogi elementarnej, jednak tak postawiony problem jest prawdopodobnie znacznie trudniejszy, gdyż zawiera w sobie między innymi zagadnienie istnienia cyklu Hamiltona (por. zad. 3.1). Można podać wiele interpretacji praktycznych problemu najkrótszych dróg. Wierzchołki mogą na przykład odpowiadać miastom, zaś każda krawędź pewnej drodze, której długość dana jest przez wagę tej krawędzi. Szukamy wtedy naj-
3.1/105
[CIA W S T Ę P N E
tszego połączenia między miastami. Waga krawędzi może też odpowiadać ;owi (lub czasowi) przesłania informacji między wierzchołkami. W takim adku szukamy najtańszej (lub najszybszej) drogi przesłania informacji, ze inną sytuację otrzymujemy, gdy waga krawędzi <w, v) jest równa prawdobieństwu p (u, v) bezawaryjnej pracy kanału przesyłania informacji. Jeśli my, że awarie kanałów są od siebie niezależne, to prawdopodobieństwo iwności drogi przesyłania informacji jest równe iloczynowi prawdopodostw odpowiadających jej krawędziom. Problem znajdowania najbardziej wodnej drogi można łatwo sprowadzić d o zagadnienia najkrótszych dróg, zamianę wag p (u, v) na a (u, v) = -logp(u,
v)
jjjjpjze jedno zastosowanie znajdowania najkrótszych dróg poznamy w punk| W rozdziale tym podawać będziemy algorytmy znajdowania odległości ni|fdzy wierzchołkami, a nie samych dróg. Mając jednak odległość możemy, pfljy założeniu dodatniej długości wszystkich cykli, łatwo wyznaczyć najkrótsze dtpgi. Wystarczy w tym celu zauważyć, że dla dowolnych s, te V(s =ć t) istnieje wierzchołek v taki, że d(s, t) = d(s, v)+a(v,
t)
Istotnie, własność taką ma przedostatni wierzchołek dowolnej najkrótszej dro gi z s do r. Z kolei możemy znaleźć wierzchołek u taki, że d (s, v) = d (s, u) + +a (u, v) itd. Z dodatniości długości wszystkich cykli łatwo wynika, że tak utworzony ciąg t, v,u,... nie zawiera powtórzeń i kończy się na wierzchołku s. Oczywiście określa on (po odwróceniu kolejności) najkrótszą drogę z s d o t. Otrzymujemy więc następujący algorytm: ALGORYTM 3.1 (Znajdowanie najkrótszej drogi) Dane:
Odległości D \y\ od ustalonego wierzchołka s do wszystkich pozosta łych wierzchołków ve V, ustalony wierzchołek t, macierz wag krawędzi A [u, v\,u,ve V.
Wyniki: STOS zawiera ciąg wierzchołków określający najkrótszą drogę z s do t. 1 2 3 4 5 6
begin STOS := 0 ; STOS , każda o takiej samej wadze j a k {w, v}. Jednakże w przypadku wag niedodatnich prowadzi to do powstania cykli o niedodatniej długości. W rozdziale tym będziemy zawsze zakładać, że G = < V, Ey jest grafem zorientowanym, n = \ V\, m = \E\. Dla uproszczenia i uniknięcia zdegenerowanych przypadków przy szacowaniu złożoności algorytmów przyjmować będzie my, że m = Q (ń) (tzn. n = O (/w)). Wyklucza to sytuacje, w których „większość" wierzchołków jest izolowanych. Będziemy również zakładać, że wagi krawędzi są pamiętane w tablicy A [w, v\, u, v e V (A [w, v] zawiera wagę a (u, v)).
Najkrótsze drogi z ustalonego wierzchołka
3
Większość znanych algorytmów znajdowania odległości między dwoma ustalo nymi wierzchołkami s, t jest oparta na postępowaniu, które w ogólnym zarysie można przedstawić następująco: Mając daną macierz wag krawędzi A [w, v\, u, v e V obliczamy pewne ograniczenia górne D \y~\ na odległość od s do wszy stkich wierzchołków v e V. Za każdym razem, gdy stwierdzamy, że D[u~] + A[u,
»] < D[v~]
(3.2)
oszacowanie D [v\ polepszamy: D [v\ — D [u~] + A [u, v\. Postępowanie przerywamy, gdy nie jest możliwa dalsza poprawa żadnego z ograniczeń D [v\. Można łatwo pokazać, że wartość każdej ze zmiennych D \y~\ jest wtedy równa d (s, v), odległości od s do v. Zauważmy, że aby wyznaczyć odległość od s do t obliczamy tu odległości od s do wszystkich wierzchołków grafu. Nie jest znany żaden algorytm znajdowania odległości między dwoma ustalonymi wierzchołkami, który byłby w istotny sposób efektywniejszy od znanych algorytmów wyznaczania odległości od ustalonego wierzchołka do wszystkich pozostałych. Opisany przez nas ogólny schemat postępowania jest niepełny, gdyż nie określa kolejności w jakiej wybierane są wierzchołki u, v do sprawdzania warun ku (3.2). Kolejność ta ma — jak się okaże — bardzo istotny wpływ na efektyw ność algorytmu. Opiszemy teraz bardziej szczegółowo metody znajdowania od ległości z ustalonego wierzchołka zwanego źródłem — oznaczać go będziemy zawsze przez s — do wszystkich pozostałych wierzchołków grafu.
3.l/107
KRÓTSZE DROGI Z USTALONEGO WIERZCHOŁKA
P o d a m y najpierw algorytm dla ogólnego przypadku, w którym zakładamy ynie b r a k cykli o ujemnej długości. Z algorytmem tym wiąże się zwykle najska L. R. F o r d a [22] i R. E. Bellmana [ 3 ] . jGORYTM 3.2 (Znajdowanie odległości od źródła do wszystkich pozostałych •zchołków — metoda Forda-Bellmana) G r a f zorientowany < V, 2?> o n wierzchołkach z wyróżnionym źród łem s e V, macierz wag krawędzi A [u, v\, u, v e V (graf nie zawiera cykli ujemnych długości), miki: Odległości od źródła do wszystkich wierzchołków grafu: D [v~\ = — d (s, v), veV. begin for v e V do D[v] == A[s, v\; D\s] — 0 ; for k := 1 to n-2 do for v e V\{s} do for ue V do D[v~] min(D[v], D[u] + A[u, v]) end (m
wodnimy poprawność tego algorytmu. W tym celu oznaczmy przez d \v) igość najkrótszej spośród dróg z s do v zawierających co najwyżej m krawę(d \v) = co, jeśli nie istnieje żadna taka droga). M a m y wtedy lm
(m+
d
=
m
i
n
r^co^)
+
a
(
W ;
): eV},veV
v
(3.3)
tl
im
+ 1
im)
tnie, dla każdego ue V mamy oczywiście d \v) < d (u) + a (w, v), przy równość występuje, gdy u jest przedostatnim wierzchołkiem dowolnej jjkrótszej drogi z s do v. Pokażemy teraz, że jeśli przy wejściu do kolejnej iteracji pętli 3 im
d (s, v) < D [u] < d \v),
dla wszystkich veV,
(3.4)
t£ p o zakończeniu tej iteracji
F im+1
** d (s, v) < D [u] < d \v), dla wszystkich v e V (3.5) litotnie, zakładając spełnienie warunku (3.4) i analizując działanie instrukcji W wierszu 5 widzimy, że p o zakończeniu naszej iteracji pętli 3 m a m y (m
d (s, v) < Z) [ U ] < min {d \u)
+ a ( U , v):ue
V}
*> po uwzględnieniu równości (3.3) daje warunek (3.5). Zauważmy, że przy wejściu do pętli 3 mamy D [ r ] = d (v), v e V, z a t e m Po wykonaniu n-2 iteracji tej pętli d(s, v) < D [u] < d ~ (v), v e V. Wystar czy teraz pokazać, że d "' (v) = d(s,v). Tak jest w istocie, gdyż każda droga ©więcej niż n—l krawędziach zawiera cykl, którego usunięcie nie zwiększa dłu•Dści drogi (założyliśmy bowiem brak cykli ujemnej długości). Dowód popraw ności algorytmu jest tym samym zakończony. (l)
in
(
1)
u
3
Oczywiste jest, że złożoność czasowa algorytmu jest O (« ). Obliczenia możemy oczywiście zakończyć, gdy wykonanie pętli 4 nie powoduje zmia ny żadnej spośród zmiennych D \y\, veV. Może to nastąpić dla k < n — 2, jednak taka modyfikacja algorytmu nie zmienia w istotny sposób jego złożoności. W przypadku grafów rzadkich (m n ) wygodnie jest reprezentować graf przez listy incydencji PRZED\y~\, v e V. Po zamianie wiersza 5 na 2
for u e PRZED\y]
do D [v] := min(D[v],
D\ii\ + A[u, v~])
otrzymujemy algorytm o złożoności O (mn).
•]
. k
D[3]
D[4]
0
1
oo
oo
0
1
4
4
2
0
1
3
0
1
1
R Y S . 3.1
D[I]
D[2]
4
OO
oo c o
3
o°
co
3
3
g
oo
oo
oo
1
-5
OO
OO
2
OO
OO
OO
OO
OO
4
OO
D[5]
3 -1
3
-1
3
-1
Działanie algorytmu Forda-Bellmana
Działanie algorytmu Forda-Bellmana zilustrowano na rys. 3.1 (V = = { 1 , 5 } , wagi krawędzi są podane w nawiasach, pętle 4 oraz 5 są wykonywane w kolejności wzrastających numerów wierzchołków).
Przypadek meujemnych wag—algorytm Dijkstry W dwóch ważnych przypadkach, a mianowicie gdy wagi wszystkich krawędzi są nieujemne lub graf jest acykliczny, znane są efektywniejsze algorytmy. Opiszemy najpierw algorytm dla pierwszego przypadku pochodzący od Dijkstry [ 1 1 ] . Drugim przypadkiem zajmiemy się w następnym punkcie. ALGORYTM 3.3 (Znajdowanie odległości od źródła do wszystkich pozostałych wierzchołków w grafie o nieujemnych wagach krawędzi — metoda Dane:
Dijkstry)
Graf zorientowany < F , E} o wyróżnionym źródle se V, macierz wag krawędzi A [u, v~], u, v e V (wszystkie wagi są nieujemne)
3/109
kGORYTM DIJKSTRY
ids
lyniki: Odległość o d źródła do wszystkich = d (s, v), v e V. begin for v e V do D[v]
wierzchołków
grafu:
D [y~\ —
A[s, vj; D[s] == 0;
T~ V\W; while T # 0 do begin u == dowolny wierzchołek reT D\f\ for D e T do D[v\ •= min(D[y], end
taki, że = mi«{Z)|>]:/»6r}; D[u]+A[u,v\)
end zrozumieć działanie algorytmu pokażemy, że następujący warunek jest zmiennikiem pętli 4 : dla każdego v e V\T dla każdego v e T
D [i>] = d (s, v), D [v] = długość najkrótszej spośród tych dróg z s d o v, dla których przedostatni wierzchołek należy d o zbioru V\T.
(3.6)
t
tnie, w wierszu 6 znajdujemy wierzchołek u e T taki, że wartość D [u] jest imalną (spośród wszystkich) wartością D [ ? ] , dla teT. Pokażemy, że D [w] = [s, ii). T a k jest w istocie, gdyż jeśli najkrótsza droga z s d o u ma długość iBtiiejszą od D [w], to na mocy drugiej części warunku (3.6) jej przedostatni
R Y S . 3.2
Uzasadnienie Dijkstry
algorytmu
Wierzchołek należy d o zbioru T. Niech t będzie pierwszym wierzchołkiem drogi ^leżącym do zbioru T. Odcinek początkowy z s do t naszej drogi stanowi naj gorszą drogę z s do t, przy czym jej przedostatni wierzchołek nie należy do bioru T. Wobec drugiej części warunku (3.6) mamy D [/] = d (s, t). korzystając z założenia o nieujemności wag otrzymujemy
2
D [>] = d(s, t) < d{s, u)
«. Wtedy
n
t
(2)
#
Oznacza to, iż istnieje cykl ujemnej długości. 3
czyn A*B dwóch macierzy wymiaru n x n możemy wyznaczyć w czasie O (n ) [.dodawań i n — 1 porównań na każdy spośród « elementów iloczynu A*B). |cierz [ ^ , ' " ] , a tym samym odległości między wszystkimi parami wierzchołmożemy zatem obliczyć w czasie O ( « ) . 2
_1)
4
Złożoność takiego algorytmu jest na razie taka sama, j a k w przypadku rotnego użycia algorytmu Forda-Bellmana. Możemy ją jednak obniżyć, jeśli yażymy, że działanie * jest łączne (tzn. (A*B)*C = A*(B*C), por. zad. 3.8). ten pozwala na obliczenie iloczynu (3.10) poprzez kolejne podnoszenie ma' A do kwadratu i tym samym zastąpienie n — l mnożeń macierzy przez [log n\ łożeń. Otrzymujemy w ten sposób algorytm o złożoności O ( « log «) znajduodległości między wszystkimi parami wierzchołków w grafie bez cykli ujemdługości. 3
Jeszcze bardziej efektywny algorytm pochodzi od Warshalla [70] i Floy[20]. Idea tego algorytmu jest następująca: Oznaczmy przez dffl długości rótszej spośród dróg z v do v o wierzchołkach pośrednich w zbiorze t
s
famy wtedy następujące r ó w n a n i a : {
*
du = a (
£
(3.11)
u
+ x )
dJ
= mind\f,
+ €+2j
dla IM = 0,1,
1
(3.12)
Uzasadnienie drugiego równania jest proste. Rozważmy najkrótszą spośród ./] v A[m, /] end (* ^ [ / , y ] = 1 o e E* *)
Załóżmy, że wiersz macierzy A mieści się w słowie maszynowym, i że pętlę 5 traktujemy j a k o jedną operację elementarną (dodanie logiczne w-tego wier sza do /-tego). Jaka jest wtedy złożoność algorytmu? 3.10 Zmodyfikuj algorytm Floyda tak, by oprócz odległości D \j,j] wyznaczał macierz M \j,j], gdzie M [i,j] jest maksymalnym numerem wierzchołka
D A N I A
^ Ł
3.6/119
pewnej najkrótszej drogi z v do Vj (M [/,/] = 0, jeśli ta droga nie zawiera wierzchołków pośrednich). Udowodnij, że procedura rekurencyjna t
l
procedurę PISZDROGE(i,j); begin if M [ / , y ] = 0 then if i = j then write(i) else write(i,j) else begin PISZDROGE{i, M[i,j]); PISZDROGE(M[i,j],j) end end
wypisuje najkrótszą drogę z v do Vj w czasie O («). Podaj wersję niereku rencyjną tej procedury. 1 Przez przepustowość drogi rozumiemy minimalną wagę krawędzi tej drogi. Podaj algorytm wyznaczający maksymalne przepustowości dróg między: (a) ustaloną parą wierzchołków; (b) wszystkimi parami wierzchołków. 2 N a podstawie techniki przeszukiwania w głąb podaj algorytm znajdujący domknięcie przechodnie dowolnej relacji E £ V x V w czasie 0(n +nm) oraz algorytm o złożoności O (n ) dla relacji symetrycznych. t
2
2
Przepływy w sieciach i zagadnienia pokrewne
Maksymalny przepływ w sieci Przez sieć rozumieć będziemy parę S grafem zorientowanym, a c: E R przyporządkowuje nieujemną liczbę tej krawędzi. Zbiory V, E nazywamy rem krawędzi sieci S. Dla dowolnej funkcji
= (s) = DivAs) + 8 = W (f) + 8 f
oces zwiększania przepływu wzdłuż ścieżki rozszerzającej pokazano na rys. 4.1. zy każdej krawędzi e p o d a n o przepływ w tej krawędzi / ( e ) oraz — w nawiasie — zepustowość c(e). Nasza ścieżka rozszerzająca ma postać «
Vi,
,
v , (v ,y y, 3
2
3
v, 2
, v , <j} , v }, v , 2
s
5
6
6
, 7
v }, v , 6
7
daje zwiększenie przepływu o 5 = A (v , v ) = 1, z 10 d o 11. s
6
6(6)
v,
^Vs.
4.1
iecio:
Z w i ę k s z a n i e p r z e p ł y w u wzdłuż ścieżki n a p r z e m i e n n e j :
t a ) przed modyfikacją {b) p o
modyfikacji
, 7
v y, 8
v
8
TWIERDZENIE
4.3
Następujące trzy warunki są równoważne: (a) Przepływ z s do t jest maksymalny. (b) Nie istnieje ścieżka rozszerzająca dla / . (c) W(J)
= c(A,
V\A)
dla pewnego A £ V takiego, że seA,
t$A.
DOWÓD
(a)=> (b) Jeśli przepływ jest maksymalny, to oczywiście nie istnieje dla niego ścieżka rozszerzająca, j a k o że istnienie takiej ścieżki umożliwiałoby zwiększenie przepływu. (b) => (c) Przypuśćmy, że dla pewnego przepływu / nie istnieje ścieżka roz szerzająca. Określmy zbiór A £ V j a k o zbiór tych wierzchołków v, dla których istnieje ścieżka v, e 0
u
v
e, v,
u
2
v_
2
k
u
e, v k
k
taka, że k > 0, v ~ s, v = v, oraz e jest krawędzią użyteczną z v _ do v , 1 < i < k. Oczywiście se A, natomiast t 4 A, gdyż oznaczałoby to istnienie ścież ki rozszerzającej dla / . Rozważmy przekrój P (A). Dla każdej krawędzi e e P (A) musi być f(e) = c(e), zgodnie z definicją zbioru A (por. warunek (4.6)), tak więc f(A, V\A) = c (A, V\A). Korzystając znów z definicji zbioru A, otrzymu jemy w podobny s p o s ó b / ( K \ ^ , A) = 0 (por. warunek (4.7)). N a mocy lematu 4.1 wnioskujemy stąd, że 0
W (/) = f(A,
k
V\A)-f(V\A,
t
A) = c (A,
i
1
t
V\A)
(c) => (a) wynika z udowodnionego już faktu, iż wartość dowolnego prze pływu nie przekracza c (A, V\.A), por. (4.5). • Nietrudno sprawdzić, że przepływ z rysunku 4. Ib jest maksymalny. Przekrój „nasycony" P (A) występujący w dowodzie twierdzenia 4.3 jest wyznaczony przez A = {v v , v , v }. u
2
3
5
D o wywnioskowania twierdzenia o maksymalnym przepływie i minimalnym przekroju z twierdzenia 4.3 brakuje nam jeszcze pewnego, dość subtelnego szczegółu. (Zachęcamy Czytelnika do zastanowienia się jakiego, przed przystą pieniem do dalszego czytania). Otóż brakującym faktem jest po prostu istnienie przepływu maksymalnego w dowolnej sieci. Innymi słowy należy pokazać, że nie jest możliwa sytuacja, w której na przykład istnieje dla każdego e > 0 prze pływ o wartości przekraczającej 7 — s, lecz nie istnieje przepływ o wartości rów nej 7 (warto zauważyć, że podobny problem dla minimalnego przekroju nie istnieje — liczba różnych przekrojów, w odróżnieniu od liczby różnych przepły wów, jest skończona). Ten prosty fakt — będący w gruncie rzeczy wnioskiem z nieostrości nierówności w warunku (4.2) — można udowodnić na wiele spo sobów. My udowodnimy go w następnym punkcie przez rozważenie pewnego algorytmu znajdowania maksymalnego przepływu.
lgorytm znajdowania maksymalnego rzepływu
4.2
jzważania z poprzedniego paragrafu sugerują ideę następującego prostego p r y t m u znajdowania maksymalnego przepływu: Startując od dowolnego zepływu (np. f(e) = 0 dla każdej krawędzi ee E) poszukujemy ścieżek rozRrzających i zwiększamy wzdłuż nich aktualny przepływ. Powstają tu jednak dwa pytania. P o pierwsze, czy taki algorytm zakończy oje działanie p o skończonej liczbie kroków, oraz p o drugie, czy otrzymany zepływ będzie maksymalny. Odpowiedź na drugie pytanie — przy założeniu, że ;orytm p o skończonej liczbie kroków zatrzyma się z braku dalszych ścieżek zszerzających — jest twierdząca, co wynika bezpośrednio z twierdzenia 4.3. itomiast Ford i Fulkerson w pracy [23] dali, w pewnym sensie, negatywną odpoedź na pierwsze pytanie. Pokazali oni mianowicie przykład sieci, w której jżna tak „złośliwie" dobierać kolejne rozważane ścieżki rozszerzające, że oces nigdy się nie kończy, co więcej, wartość przepływu jest przez cały czas aiejsza od jednej czwartej wartości przepływu maksymalnego. Edmonds i K a r p (por. poz. [17]) pokazali, że jeśli aktualny przepływ zwiękimy zawsze wzdłuż najkrótszej ścieżki rozszerzającej, to maksymalny przepływ iągany jest p o użyciu co najwyżej mn/2 ścieżek (jak zwykle n = \V\, m = \E\). alezienie najkrótszej ścieżki łatwo zrealizować przez algorytm analogiczny do zeszukiwania wszerz (por. p . 2.3). Mówiąc dokładniej, startując ze źródła s zeszukujemy wszerz graf G złożony z krawędzi takich, że istnieje w nasj sieci krawędź użyteczna z u d o o względem aktualnego przepływu / , aż do omentu osiągnięcia ujścia t. Znaleziona przez ten proces najkrótsza droga z s t odpowiada oczywiście najkrótszej ścieżce rozszerzającej z j d o / w naszej sieci, orąc pod uwagę fakt, że procesu przeszukiwania wszerz możemy dokonać czasie O (m + ń), złożoność całego algorytmu znajdowania maksymalnego przeu możemy oszacować j a k o O {mn (m + ń)). Nie będziemy się tu bliżej zajwać tym algorytmem, jako że w dalszej części tego paragrafu pokażemy efekwniejszą metodę, o złożoności O ( « ) . f
3
Ciekawą technikę zastosował do znajdowania maksymalnego przepływu tinic w pracy [13]. Polega ona na konstruowaniu pewnej pomocniczej sieci Acyklicznej (tzn. o grafie nie zawierającym cykli), której struktura dokładnie odfwierciedla wszystkie najkrótsze ścieżki rozszerzające z s do t względem aktual nego przepływu / . Sieć taką - oznaczmy ją przez S - konstruujemy przez przeszukiwanie wszerz wspomnianego już grafu G o krawędziach określonych Przez istnienie w naszej sieci użytecznych krawędzi względem przepływu / . Sieć S Sawiera źródło s, ujście t, oraz krawędzie grafu G postaci , gdzie u znajduje 'C w odległości d, a v w odległości d+1 od s, przy czym 0 < d < l, a / jest dłu gością sieci S , tzn. odległością od s do t w grafie G . Przepustowość c (u, v) Określamy j a k o c(u, v) -/(«, v) lub / ( u , u), w zależności od tego, czy krawędź f
f
f
f
8
f
f
f
], PRZED [r>], v e V, oraz przez tablicę przepustowości krawędzi C [u, v\, u, ve V, natomiast aktualny przepływ f okre ślony jest przez tablicę F\u, v\, u, v e V. Zmienne odnoszące się do konstruowa nej sieci pomocniczej S odróżnione są od zmiennych odnoszących się do ory ginalnej sieci S przez pierwszą literę X: mamy zbiór wierzchołków XV, listy incydencji XZA [w], XPRZED \y\, v e XV, oraz tablice przepustowości i prze pływów XC i XE. Odległość wierzchołka od źródła w sieci S pamiętana jest w tablicy O DL. Struktura procedury PSA jest następująca: P o inicjalizacji w wier szach 3 H - 7 następuje przeszukiwanie wszerz grafu G , poczynając od źródła s (p. główna pętla w wierszu 9). Kolejno odwiedzane w procesie przeszukiwania wierzchołki v są umieszczane w kolejce (p. wiersze 13 i 21), każdy wierzchołek u pobierany z kolejki (wiersz 10) wykorzystywany jest natomiast w dwóch pętlach (p. wiersze 11 i 19). Pierwsza z nich przeszukuje zgodne krawędzie użyteczne . Zauważmy, że sieć może za wierać jednocześnie zgodną krawędź użyteczną oraz przeciwną krawędź użyteczną (v, u). Krawędź v
end; for ve XV do Q [v\ ••= 0 ( * inicjalizacja ładunków wierzchołków * ) XN-.= XV;(*XN zawierać będzie wierzchołki o niezerowym potencjale*) while XN # 0 do (* główna pętla * )
begin (* wyeliminowanie wierzchołków o zerowym potencjale *)
17 18
while STOS # 0 do begin v * ) == POTWY[ii]-(XC[u, v\-XF[u,
21
XZA[ii] := XPRZED[v]
22 23 24 25 26
if P C » r [ ] # 0 then ( * zmodyfikuj POT[u] *) begin POT[u] == w / « ( P 0 7 1 F £ [ w ] , P 0 7 ^ y [ M ] ) ; if POT[u~] = 0 then STOS *) begin POTWE[u] POTWE[ii\ - (XC[v, ii] - XF[v, u]); XPRZED\u] := XPRZED[u]\{v}; XZA\y] •.= XZA[v]\{u};
30 31 32 33 34 35
if POT{ii] # 0 then (* zmodyfikuj POT[u] *) begin POT[u] ••= min(POTWE[u],POTWY[n]); if POT[u] = 0 then STOS C [ M , V\ then begin F\y, u] ••= F\v, u] - (F\u, v\ - C[u, v\); F[ii, v~\••=C\u, v~\ end end end (* koniec fazy *) until ODL\t\ = OO (* przepływ F jest maksymalny *) end Z przeprowadzonej już analizy procedur PSA i MAXPSA, ba faz nie przekracza n (por. wniosek 4.5) otrzymujemy NIOSEK
oraz z faktu, iż
4.7 3
orytm 4.6 poprawnie konstruuje maksymalny przepływ w czasie O (n ).
B
Zauważmy, że przez analizę tego algorytmu wykazaliśmy istnienie przepły wu maksymalnego w dowolnej sieci, a tym samym dostarczyliśmy brakującego fragmentu do dowodu fundamentalnego twierdzenia o maksymalnym przepływie i minimalnym przekroju (twierdzenie 4.2). W a r t o zauważyć, że choć algorytm 4.6 nie podpada bezpośrednio pod sche mat kolejnego zwiększania przepływu wzdłuż ścieżek rozszerzających, to jednak metoda użyta w tym algorytmie może być uważana za uogólnienie techniki ście żek rozszerzających. Zwiększenie przepływu (o wartość równą minimalnemu potencjałowi) odbywa się wzdłuż nieco ogólniejszej struktury niż pojedyncza ścieżka rozszerzająca z s do t. Strukturę tę można nazwać „wielościeżką roz szerzającą" z s do t, przechodzącą przez wierzchołek r (o minimalnym poten cjale). Wykorzystanie takiej wielościeżki powoduje wyeliminowanie co najmniej jednego wierzchołka — a nie, tak jak w przypadku pojedynczej ścieżki rozsze rzającej, jednej krawędzi — stąd mniejsza liczba iteracji i tym samym lepsze oszacowanie złożoności algorytmu. Odnotujmy na zakończenie następującą algorytmu 4.6: TWIERDZENIE
oczywistą lecz ważną własność
4.7
Jeśli wszystkie przepustowości krawędzi są liczbami całkowitymi, to maksy malny p r z e p ł y w / z n a l e z i o n y przez algorytm 4.6 jest całkowitoliczbowy, tzn. / ( e ) jest liczbą całkowitą dla każdej krawędzi e. •
Skojarzenia o maksymalnej liczności w grafach dwudzielnych Skojarzeniem w grafie niezorientowanym G = (V, E} nazywamy dowolny zbiór krawędzi M £ E taki, że żadne dwie krawędzie ze zbioru M nie są incydentne ze wspólnym wierzchołkiem. Innymi słowy, M j e s t skojarzeniem, jeśli dla każdych dwóch krawędzi e , e eM mamy e = e lub e n e = 0 . Dla każdej kra wędzi {u, v} e M mówimy, że M kojarzy u z v, natomiast każdy wierzchołek, który nie jest incydentny z żadną krawędzią skojarzenia będziemy nazywać wolnym. Szczególnie interesujące są problemy związane ze skojarzeniami w grafie dwudzielnym, tzn. grafie niezorientowanym G = (_V,Ey takim, że zbiór wierz chołków można rozbić na dwa rozłączne zbiory, V = j f u Y, X n Y = 0 takie, że każda krawędź eeEma postać e = {x,y), gdzie xe X, y e F ( p o r . zad. 4.15). Graf taki oznaczać będziemy zwykle przez M , jest odwrotnością odwzorowania M^>f , tzn./ =/i M = M. • M
f
1
2
2
2
f
t
2
f
f
M /
M
fM
Twierdzenie 4.8 pozwala użyć do wyznaczenia skojarzenia o maksymalnej liczności dowolnego algorytmu znajdowania maksymalnego przepływu (całkowitoliczbowego). Jeśli skorzystamy z algorytmu 4.6, to skojarzenie o maksymalnej liczności znajdziemy w O (n ) krokach. Okazuje się jednak, że szczególna postać sieci S (H) pozwala na bardziej efektywny algorytm. Algorytm ten, pochodzący od Hopcrofta i K a r p a [33] stosuje ogólny schemat Dinica, tzn. składa się z faz odpowiadających zwiększaniu przepływu wzdłuż najkrótszych ścieżek rozsze rzających określonej długości. Jednakże szczególna postać sieci pozwala zarówno na lepsze ograniczenie na liczbę faz, j a k i efektywniejszy algorytm znajdowania przepływu pseudomaksymalnego w każdej fazie. 3
Zauważmy na początek, że każda ścieżka rozszerzająca w S (H) parzystej długości i składa się, p o odrzuceniu pierwszej i ostatniej z ciągu na przemian występujących krawędzi zgodnych i przeciwnych jącego i kończącego się krawędzią zgodną). Dla danego skojarzenia M, ścieżką naprzemienną (długości / = 2k+ 1, z X do Y) względem M zbiór krawędzi P £ E postaci P = {{*O,
{>i, Xi), {x
u
y },
\y ,
2
x }, {x , y }}
k
k
k
jest nie krawędzi, (zaczyna nazwijmy dowolny (4.13)
k+i
gdzie k > 0 , wszystkie wierzchołki x , ...,x ,yi, ...,y i są różne, x jest wol nym wierzchołkiem w X, y jest wolnym wierzchołkiem w Y, oraz co druga krawędź należy do M, tzn. 0
k
k+
k + l
P
N
M = {{y
lt
XI},
{y , 2
x }, 2
{y , k
x }} k
0
ieżkę naprzemienną'można oczywiście jednoznacznie określić podając ciąg x , ,Xi,y , •••,>'*, x ,y . Jest jasne, że przy opisanej w twierdzeniu 4.8 odpoiedniości między skojarzeniami w H a przepływami zerojedynkowymi w sieS(H) ścieżka naprzemienna (4.13) w naturalny sposób odpowiada pewnej 'eżce rozszerzającej względem przepływu f w S(H), mianowicie ścieżce 0
2
k
k+1
M
s, <s, x > , x , < x , yt}, y 0
•
0
0
lt
yu, <x , y y, k
k
x, k
(x
yO, x
u
u
<x , y k
k + 1
}, y
<x k + 1
1 ;
y ~>, y , ••• 2
, i skojarzenia M w H, wygodnie jest wprowadzić graf zorientowany H przez zorientowanie wszystkich krawę dzi e e M z Y do X, oraz wszystkich krawędzi e e E\M z X do Y (drogi w H z wolnego wierzchołka w X do wolnego wierzchołka w Y odpowiadają dokładnie ścieżkom naprzemiennym względem M). Procedura PGA konstruuje najpierw krawędzie ze źródła s do wszystkich wolnych wierzchołków x e X (wiersze 6 -f- 10). Następnie jest przeszukiwany wszerz graf H , poczynając od wolnych wierzchoł ków w X. P o znalezieniu każdego wolnego wierzchołka yeY dodajemy do p o mocniczego grafu acyklicznego krawędź (y, t} (wiersze 14 -f- 17), przy czym od momentu dodania pierwszej takiej krawędzi nie rozpatrujemy już w procesie przeszukiwania wierzchołków znajdujących się w większej lub równej odległości od s niż t (p. warunek w wierszu 20). Powiększanie aktualnego skojarzenia wzdłuż maksymalnego zbioru najkrótszych ścieżek rozszerzających o parami rozłącznych zbiorach wierzchołków jest realizowane przez procedurę FAZA. Przeszukuje ona pomocniczy graf acykliczny w głąb, poczynając od s. Główna pętla w wierszu 40 przypomina nierekurencyjną procedurę przeszukiwania w głąb WG1 (por. p . 2.2). Za każdym razem, gdy w naszym procesie osiągamy ujście t (p. wiersz 50), za wartością stosu STOS jest ciąg wierzchołków reprezentujący pewną ścieżkę na przemienną (zauważmy, że ujście t nie jest kładzione na STOS, a tym samym przez cały czas NOWY \t~\ = trne i może ono być odwiedzane wielokrotnie). Pętla 52 dokonuje modyfikacji tablicy SKOJ odpowiadającej zwiększeniu skojarzenia wzdłuż takiej ścieżki. Zauważmy, że jeśli w trakcie wykonywania naszej proce dury pewnemu wierzchołkowi veV przypisywana jest wartość NOWY [i>] := := false, to procedura ta albo znajduje potem ścieżkę naprzemienną przecho dzącą przez ten wierzchołek, albo też stwierdza, że nie istnieje żadna ścieżka przechodząca przez ten wierzchołek i nie przecinająca żadnej z uprzednio zna lezionych ścieżek. Stąd łatwy wniosek, że procedura FAZA znajduje maksymalny zbiór nieprzecinających się najkrótszych ścieżek naprzemiennych. Poprawność całego algorytmu wynika więc z analizy metody Dinica przeprowadzonej w p o przednim punkcie. M
M
M
ALGORYTM 4.10 (Znajdowanie Hopcrofta-Karpa) Dane:
skojarzenia
o maksymalnej
liczności
metodą
Graf dwudzielny H = {X, Y, £ > reprezentowany przez listy incyden cji ZA [xj, x e X.
Wyniki: Skojarzenie o maksymalnej liczności reprezentowane przez tablicę SKOJ (SKOJ jest wierzchołkiem skojarzonym z v lub zerem jeśli v jest wolny).
1
procedurę PGA; (* konstruowanie pomocniczego grafu acyklicznego; zmienne V, XV, X, Y, SKOJ, ZA, XZA, s, ł są globalne *) begin for w e F u {s, t} do (# inicjalizacja #) begin ODL[u] : = OO; XZA[u] -.= 0 end; (* umieść wolne wierzchołki xe X w kolejce i na liście XZA\s\ *) ,6 KOLEJKA .= 0 ; XV ••= {s}; ODL[s] == 0; 7 for x e X do *8 if SKOJ[x~] = 0 then (* x wolny * ) 9 begin KOLEJKA , miaowicie skojarzeniu { { a y }, {a„, y„}}. x
1;
n
t
n
Biorąc pod uwagę fakt, że graf Hma m + n wierzchołków i £
\Aj\ krawędzi,
j= i
trzymujemy "NIOSEK
4.13
la danego ciągu zbiorów (A , ...,A y możemy znaleźć system różnych reprentantów lub też stwierdzić, że żaden taki system nie istnieje, w czasie x
n
(V« 1 Myl)-
B
OWÓD
iczba faz w algorytmie Hopcrofta-Karpa zastosowanym do grafu H nie przeacza lijnł + l (por. twierdzenie 4.12). Stąd liczba kroków algorytmu jest n
(yjn (n+
^
\Aj\y).
Możemy zakładać, że wszystkie zbiory Aj są niepuste,
j= i
przeciwnym razie system różnych reprezentantów oczywiście nie istnieje. n
n
rzy takim założeniu n+
£ \Aj\ < 2 ^ \A \, co daje żądane oszacowanie złoj=i j=i oności algorytmu. B Udowodnimy teraz klasyczne twierdzenie Ph. Halla [30] dające warunek onieczny i dostateczny istnienia systemu różnych reprezentantów dla danego iągu zbiorów. TWIERDZENIE
}
4.14
System różnych reprezentantów dla ciągu (A , wtedy, gdy
A„} istnieje wtedy i tylko
x
\\JAj\
>\J\,
dla każdego J |U {aj}\ = \J\ Jej
jej
Załóżmy teraz, że nie istnieje system różnych reprezentantów dla (A , ...,A„}, i rozważmy skojarzenie M o maksymalnej liczności w grafie H = (X, Y, E), odpowiadającym ciągowi {A , ...,A„} (por. ze wzorami (4.14), (4.15), (4.16)). Oczywiście \M\ < n, a więc istnieje w Y wierzchołek wolny, powiedzmy b . Oznaczmy przez X zbiór tych wierzchołków x e X, d o których istnieje „częścio wa ścieżka naprzemienna" z b postaci ±
1
0
0
0
b, a 0
u
b,
b _i,
x
k
a
k
gdzie k > 1, a = x, {a b(} e M dla 1 < i < k—l, oraz a,} e E\Af dla X nie zawiera oczywiście wierzchołków wolnych, jako że taki k
h
0
10 KOMOINATORYKA
wierzchołek odpowiadałby ścieżce naprzemiennej, wbrew założeniu, że M ma maksymalną liczność. Niech Y będzie zbiorem wierzchołków skojarzonych przez M z wierzchołkami z X . Oznaczmy J ~ {j: 1 e X x Y. Realizacja odwzorowania