Grafy skierowane

Transkrypt

Grafy skierowane
Matematyka Dyskretna
Andrzej Szepietowski
25 czerwca 2002 roku
Rozdział 1
Grafy skierowane
W tym rozdziale zajmiemy siȩ algorytmami wyszukiwania najkrótszej drogi w grafach
skierowanych. Każdej krawȩdzi przypiszemy długość (wagȩ) i algorytmy bȩda̧ szukać
drogi, dla której suma długości krawȩdzi jest najmniejsza.
1.1 Grafy skierowane
Definicja 1.1 Graf skierowany (zorientowany) to dowolna para
nym zbiorem wierzchołków i zbiorem krawȩdzi
.
, ze skończo-
Rysunek 1.1: Graf skierowany
W grafie skierowanym krawȩdź
jest skierowana od wierzchołka do wierzchołka . Wierzchołek nazywamy pocza̧tkiem krawȩdzi, a wierzchołek ko ńcem. Na
rysunkach krawȩdzie skierowane bȩdziemy przedstawiać jako strzałki. Droga w grafie
skierowanym jest to cia̧g wierzchołków
, taki, że dla każdego
,
wierzchołki
, sa̧ poła̧czone krawȩdzia̧, czyli
. Drogȩ
nazywamy cyklem jeżeli
, oraz wszystkie wierzchołki
sa̧ różne. Na
przykład cia̧g wierzchołków
jest cyklem w grafie z rysunku 1.1. Dla grafów
skierowanych dopuszczamy cykl złożony z dwóch wierzchołków, na przykład cia̧g
stanowi cykl w grafie z rysunku 1.1. Krawȩdź typu
, w której pocza̧tek i koniec
pokrywaja̧ siȩ, nazywamy pȩtla̧. Można przyja̧ć, że pȩtla jest cyklem długości jeden.
3
/01! "/
!"$#%#$#&
'
*),+ +.2/01!" "/3546
7( 8 !9%#$( #%#$ '
":;'
8!"$#$#%#& '
2< 1
4
Rozdział 1. Grafy skierowane
Definicja 1.2 Graf skierowany jest (silnie) spójny, jeżeli dla każdych dwóch jego wierzchołków i istnieje droga z do .
Przykład 1.3 Graf z rysunku 1.1 nie jest spójny, bo nie ma w nim drogi z do .
1.2 Najkrótsze drogi w grafie
Przypuśćmy teraz, że każdej krawȩdzi przypisano długość (wagȩ)
przy tym ujemne długości. Dla każdej drogi w grafie
. Dopuszczamy
7%#$#$#% zdefiniujmy jej długość jako sumȩ długości krawȩdzi, czyli
/! 2"/01!" "/3 #
Jeżeli , droga składa siȩ z pojedynczego punktu, to przyjmujemy, że jej długość wynosi 0. W tym rozdziale interesuja̧ nas algorytmy wyznaczania najkrótszej drogi ła̧cza̧cej
dwa wierzchołki i w grafie.
Przykład 1.4 Jako przykład zastosowania algorytmu wyszukiwania najkrótszej drogi w
grafie rozpatrzmy sieć poła̧czeń, czyli graf, w którym krawȩdzie reprezentuja̧ ła̧cza pomiȩdzy
wȩzłami. Z każda̧ krawȩdzia̧ zwia̧zane jest prawdopodobieństwo , że krawȩdź zadziała bez awarii. Zakładamy, że awarie poszczególnych
krawȩdzi
sa̧
od
siebie
niezależne.
Przyjmijmy teraz długość krawȩdzi jako
.
Najkrótsza
droga
jest wtedy
droga̧ z najmniejszym prawdopodobieństwem awarii.
Łatwo zauważyć, że jeżeli w grafie sa̧ cykle o ujemnej długości, to dla pewnych par
wierzchołków nie istnieje najkrótsza droga miȩdzy nimi. Powtarzaja̧c przejście wzdłuż
cyklu można wtedy otrzymywać drogi o długości dowolnie małej. Dlatego w dalszej
czȩści bȩdziemy zakładać, że w grafie wszystkie cykle sa̧ dodatniej długości.
Problem znajdowania najkrótszej drogi w grafie nieskierowanym, jeżeli wszystkie
krawȩdzie maja̧ dodatnie długości, można sprowadzić do przypadku grafu skierowanego. Wystarczy każda̧ krawȩdź zasta̧pić przez dwie krawȩdzie
i
. Jeżeli
w grafie sa̧ krawȩdzie o ujemnych długościach, to sposób ten prowadzi do powstania cykli
ujemnej długości.
Opisane tu algorytmy składaja̧ siȩ z dwóch etapów. W pierwszym etapie wyznaczamy
długości najkrótszych dróg z do wszystkich wierzchołków w grafie. A dopiero w drugim
etapie wyznaczymy najkrótsza̧ drogȩ z do .
Najpierw opiszemy drugi etap, czyli jak znaleźć najkrótsza̧ drogȩ z do , jeżeli znane
sa̧ odległości z do wszystkich wierzchołków grafu. Algorytm ten bȩdziemy opisywać
przy pomocy przykładu grafu z rysunku 1.2.
Dla prostoty algorytmu przyjmujemy
, jeżeli
. Załóżmy, że
macierz zawiera odległości od do wszystkich pozostałych wierzchołków grafu.
< 2< 2< ,
4
1.3. Algorytm Forda-Bellmana
)
5
Rysunek 1.2: Graf z długościami krawȩdzi
)
v
s
0
a
1
b
0
c
-1
d
1
t
2
od , czyli długość najkrótszej drogi z do . Przyjmujemy
zawiera odległość
, jeżeli nie ma żadnej drogi z do . Najkrótsza̧
przy tym, że oraz drogȩ od do wyznaczamy teraz od końca. Najpierw szukamy przedostatniego wierzchołka tej drogi, później trzeciego od końca i tak dalej. Przedostatni wierzchołek najkrótszej drogi spełnia równość
2 #
,
2< i tak dalej, aż odtworzymy cała̧ drogȩ .
W naszym przykładzie jest to
W naszym przykładzie tylko wierzchołek
spełnia ta̧ równość. Zauważmy, że isnieje
, to otrzymamy
droga długości z do . Jeżeli przedłużymy tȩ drogȩ o krawȩdź
drogȩ z do długości , czyli najkrótsza̧ drogȩ z do . Jest też
jasne, że taki wierzchołek istnieje. Jest to przedostatni wierzchołek dowolnej najkrótszej
drogi z do . Trzeci od końca wierzchołek spełnia równość
Algorytm ten musi zakończyć pracȩ, ponieważ kolejne wierzchołki odsłanianej drogi sa̧
różne. Inaczej mielibyśmy cykl, co nie jest możliwe, jeżeli w grafie wszystkie cykle sa̧
dodatniej długości.
1.3 Algorytm Forda-Bellmana
W tym podrozdziale opiszemy pierwszy z algorytmów obliczania wartości macierzy .
Mówia̧c z grubsza polega on na przyjȩciu najpierw pewnych górnych oszacowa ń na wartości i poprawianiu ich potem. Jeżeli na jakimś etapie pracy algorytmu mamy wartość , to znaczy, że znaleziono już drogȩ od do długości . Jeżeli później algorytm znajdzie krótsza̧ drogȩ, to wartość zostanie poprawiona. Znajdowanie krotszej
drogi polega na szukaniu wierzchołka spełniaja̧cego warunek
3#
6
Rozdział 1. Grafy skierowane
Algorytm [Forda-Bellmana]
, długości krawȩdzi
Dane wejściowe: Graf skierowany
Dane wyjściowe: Macierz odległości z do wszystkich wierzchołków.
dla każdego
podstaw ;
dla każdego od 1 do
zrób:
.
4 dla każdego zrób:
4 zrób: ( 2< dla każdego
. Jest to pierwsze
Algorytm Forda-Bellmana
najpierw podstawia 4 algorytm sprawdza,
przybliżenie. Potem w rundach, dla każdego wierzchołka
czy istnieje wierzchołek , który wyznacza krótsza̧ drogȩ do .
Przykład 1.5 Algorytm Forda-Bellmana zastosowany do grafu z rysunku 1.2 działa w
nastȩpuja̧cy sposób: Na pocza̧tku macierz przedstawia siȩ nastȩpuja̧co:
v
s
0
a
b
2
c
2
d
1
t
- )
6
)
,
)5 ) ) )
:
5 ) W pierwszej iteracji zewnȩtrznej pȩtli, dla
, algorytm dla każdego wierzchołka
sprawdza, czy istnieje wierzchołek , przez który wiedzie krótsza droga do . I
tak dla
, stwierdza, . Oznacza, to, że
droga z do a potem krawȩdzia̧ do jest krótsza od dotychczasowego oszacowania .
. Dla
wartość nie zmienia siȩ
Dlatego algorytm podstawia 3 na ponieważ droga przez nie jest krótsza od dotychczasowego
oszacowania.
Dla
algorytm znajduje krótsza̧ drogȩ przez ; i zmienia na
. Dla
wartość macierzy nie jest
algorytm odnajduje drogȩ przez , korygowana,
a
dla
i posyła . Tak wiȩc po pierwszej iteracji pȩtli macierz ma nastȩpuja̧ce
wartości:
v
s
0
a
3
b
2
c
-1
d
1
t
4
b
0
c
-1
d
1
t
4
- tylko wartość zostaje poprawiona, gdyż ) ) . Nowa
. Pozostałe wartości nie zmieniaja̧ siȩ i
wartość W
drugiej
iteracji dla
po drugiej iteracji macierz wygla̧da tak
v
)
- s
0
a
3
W trzeciej iteracji pȩtli dla
algorytm najpierw znajduje krótsza̧ drogȩ do (przez )
i poprawia , a potem znajduje krótsza̧ drogȩ do (przez ) i poprawia .
Po trzeciej iteracji macierz wygla̧da tak
v
s
0
a
1
b
0
c
-1
d
1
t
2
1.4. Dodatnie długości, algorytm Dijsktry
7
Jest to ostateczna postać macierzy, gdyż w czwartej iteracji jej wartości nie sa̧ już poprawione.
(
Aby udowodnić, że algorytm działa poprawnie pokażemy przez indukcjȩ, że po -tej iteracji zewnȩtrznej pȩtli zawiera długość najkrótszej drogi z do zawieraja̧cej co
najwyżej
krawȩdzi. Przed pierwsza̧ iteracja̧ zawiera długość drogi złożonej z
jednej lub zero krawȩdzi. Załóżmy, że po iteracjach zawiera długość najkrótszej drogi
z
lub mniej krawȩdziami.
Przypuśćmy, że
jest najkrótsza̧ spośród dróg
z do z
lub mniej krawȩdziami. Droga jestnajkrótsza̧ droga̧ do
z
lub mniej krawȩdziami. Gdyby istniała krótsza droga
do z co najwyżej
krawȩdziami, to mielibyśmy krótsza̧ drogȩ
do z co najwyżej
krawȩdziami; sprzeczność. Czyli długość drogi jest równa po tej iteracji. Dlatego po
iteracji bȩdzie zawierać długość najkrótszej drogi
do z
krawȩdziami.
Po zakończeniu pracy algorytmu zawiera długość najkrótszej drogi z do ,
ponieważ, jeżeli w grafie wszystkie cykle sa̧ dodatniej długości, to w minimalnej drodze
żaden wierzchołek nie powtarza siȩ i droga nie zawiera wiȩcej niż
krawȩdzi.
Algorytm
zawiera
trzy
pȩtle
zagnieżdżone
jedna
w
druga̧.
Zewnȩtrzna
pȩtla wykonuje
siȩ
razy.
Dla
każdego
wewnȩtrzna
pȩtla
wykonuje
siȩ
razy,
raz
dla każdego
, a dla każdego mamy wykonań najbardziej wewnȩtrznej
pȩtli, czyli czas
, gdzie i to
działania algorytmu można oszacować przez stałe. Tak wiȩc złożoność czasowa algorytmu wynosi
.
( )
( )
(
(
%#$#$#% ! ! ( ) (
( )
%#$#$#$ !
( )
)
$ )9 + !
( ( 4
$#%#$#$
!
! )
1.4 Dodatnie długości, algorytm Dijsktry
W tym podrozdziale podamy algorytm znajdowania odległości od źródła do wszystkich
wierzchołków grafu dla przypadku, gdy długości wszystkich krawȩdzi sa̧ dodatnie.
Algorytm Dijkstry
Dane wejściowe: Graf skierowany
, dodatnie długości krawȩdzi
.
Dane wyjściowe: Macierz odległości z do wszystkich wierzchołków.
dla każdego
podstaw ;
dopóki 4
powtarzaj:
4 3 2< podstaw wybierz wierzchołek
;
dla każdego
4
4
taki, że 8
Rozdział 1. Grafy skierowane
1
4 4
Podobnie jak w poprzednim algorytmie na pocza̧tku macierz
zawiera długość
krawȩdzi , a jeżeli takiej krawȩdzi nie ma, to . Zbiór zawiera wierzchołki, dla których nie jest jeszcze wyliczona dokładna odległość od . Poniżej pokażemy, że dla
,
zawiera
długość najkrótszej spośród dróg, której przedostatni
wierzchołek należy do
. Nastȩpnie w każdej iteracji zewnȩtrznej pȩtli bierzemy
, który leży najbliżej od . Jak siȩ za chwile okaże ten wierzchołek ma
wierzchołek
już prawidłowa̧ wartość i dlatego jest on usuwany z . Teraz korygujemy wartości
dla pozostałych wierzchołków z uwzglȩdniaja̧c drogi, w których wierzchołek
jest przedostatni.
Przykład 1.6 Rysunek 1.3 przedstawia graf z dodatnimi długościami krawȩdzi. Poniższa tabela ilustruje działanie algorytmu Dijkstry. Pokazuje jak w kolejnych iteracjach
zewnȩtrznej pȩtli wybrano wierzchołek oraz jak przedstawiaja̧ siȩ zbiór i macierz .
iteracja
0
1
2
3
4
5
0 1 5 0 1 2 4 0
1
2
3
6
0
1
2
3
4
6
0
0
)
1
1
)
2
2
3
3
4
4
5
5
Rysunek 1.3: Graf z dodatnimi długościami krawȩdzi
)
)
)
)
Aby udowodnić poprawność tego algorytmu, pokażemy przez indukcjȩ, że po każdej iteracji pȩtli mamy
(a) dla każdego wierzchołka
drogi z do .
4 zawiera ostateczna̧ długość minimalnej
,
4 4 , a dla każdego innego wierzchołka 4 ,
Przed
pierwsza̧
pȩtla̧ tylko . Warunki (a) i (b) sa̧ wiȩc spełnione, Ponieważ w najkrótszej drodze do
,
(b) dla każdego wierzchołka
zawiera długość minimalnej
spośród
wszyst kich dróg z do , w których przedostatni wierzchołek należy do
nie ma pȩtli, wiȩc drogi, w których jest przedostatni składaja̧ siȩ tylko z jednej krawȩdzi.
1.5. Najkrótsza droga w grafach acyklicznych
4
9
, dla którego W kolejnej iteracji wybieramy wierzchołek
jest najmniejsza. Pokażemy, że wartość jest już ostateczna, czyli jest równa długości najkrótszej spośród
wszystkich dróg z do . Przypuśćmy, że istnieje krótsza droga i niech bȩdzie takim
wierzchołkiem, że droga z do zawiera tylko wierzchołki z i wierzchołek przed
nie należy do . Mamy
, bo inaczej mielibyśmy sprzeczność z założeniem indukzawiera długość najkrótszej spośród dróg, z których przedostatni wierzcyjnym, że chołek nie jest z . Zauważmy, że droga z do ma długość równa̧ aktualnej wartości
. Z drugiej strony ponieważ długości sa̧ nieujemne mamy
+ 4
sprzeczność z zasada̧ wyboru .
,
Dlatego może być usuniȩty z . Nastȩpnie algorytm sprawdza dla każdego
czy istnieje jakaś droga z do , w której wierzchołek jest przedostani i która jest krótsza od aktualnej wartości . Zauważmy, że dotychczasowa wartość zawierała
długość najkrótszej
drogi
do
,
w
których
przedostatnim
wierzchołkiem
był
jakiś
wierz chołek z
różny od . Dlatego po tym sprawdzeniu
bȩdzie
spełniony
warunek
(b).
Czas działania algorytmu Dijkstry jest
, ponieważ mamy tylko podwójne zagnieżdżenie pȩtli i liczba iteracji obu jest ograniczona przez .
1.5 Najkrótsza droga w grafach acyklicznych
Inny przypadek, kiedy można szybciej niż w czasie
policzyć długości najkrótszych
dróg do wszystkich wierzchołków w grafie, zachodzi wtedy, gdy w grafie nie ma cykli.
Najpierw pokażemy, że w grafie acyklicznym można tak ponumerować wierzchołki tak,
każda krawȩdź prowadziła od wierzchołka z niższym numerem do wierzchołka z wyższym numerem.
Lemat 1.7 W każdym skierowanym grafie
którego nie wchodza̧ żadne krawȩdzie.
!
bez cykli istnieje wierzchołek, do
Dowód: Weźmy dowolny wierzchołek . Jeżeli nie wchodzi do niego, żadna krawȩdź,
to koniec, znaleźliśmy. Jeżeli wchodzi, to niech bȩdzie wierzchołkiem, z którego prowadzi krawȩdź do . Albo jest dobry, albo prowadzi do niego krawȩdź od jakiegoś
wierzchołka itd. Ponieważ zbiór wierzchołków jest skończony i nie ma w nim cyklu, wiȩc ten cia̧g musi siȩ kiedyś skończyć i dojdziemy do wierzchołka, do którego nie
prowadza̧ żadne krawȩdzie.
8!
Lemat 1.8 W skierowanym grafie acyklicznym
można tak ponumerować
wierzchołki, aby każda krawȩdź prowadziła od wierzchołka z niższym numerem do wierzchołka z wyższym
numerem, czyli istnieje wzajemnie jednoznaczna funkcja
taka, że jeżeli
, to
.
)$#%#$#& Dowód:
2< 4
21 2 10
Rozdział 1. Grafy skierowane
Jako dowód przedstawimy algorytm, który odpowiednio numeruje wierzchołki grafu kolejnymi liczbami naturalnymi. Najpierw sa̧ numerowane i usuwane z grafu wierzchołki, do których nie wchodza̧ żadne krawȩdzie. Po usuniȩciu tych wierzchołków i
wychodza̧cych z nich krawȩdzi znowu otrzymamy graf bez cykli, który zawiera wierzchołki bez wchodza̧cych krawȩdzi. Teraz te z koleji wierzchołki sa̧ numerowane kolejnymi numerami i usuwane z grafu, i tak dalej aż do ponumerowania wszystkich wierzchołków.
)
Rysunek 1.4: Graf acykliczny
)
)
)
) Przykład 1.9 Zastosujmy powyższy algorytm do grafu z rysunku 1.4. Wierzchołkami bez
wchodza̧cych krawȩdzi sa̧ i . Przypisujemy wiȩc i
oraz usuwamy i z grafu wraz z wychodza̧cymi z nich krawȩdziami. Teraz wierzchołek nie ma
wchodza̧cych krawȩdzi, przypisujemy mu
i usuwamy z grafu. W dalszych krokach algorytm przypisze wartości
,
oraz . Ostatecznie hunkcja
ma postać:
v
s
1
a
4
b
2
c
3
d
5
t
6
Przedstawimy teraz algorytm wyliczaja̧cy odległości z do wszystkich wierzchołków w
grafie acyklicznym. Zakładamy przy tym, że w grafie wierzchołki sa̧ ponumerowane
tak, jak opisano to w lemacie 1.8. Bez straty ogólności można założyć, że jest pierwszy,
ponieważ nie ma ścieżek z do wierzchołków o niższych numerach.
;
, długości krawȩdzi Algorytm wyliczaja̧cy odległości wszystkich wierzchołków w grafie acyklicznym
Dane wejściowe: acykliczny graf skierowany
.
Dane wyjściowe: Macierz dla każdego
4
odległości z do wszystkich wierzchołków.
podstaw ;
dla każdego 4 po kolei według numerów zrób:
dla każdego , < 2< 1.6. Zadania
11
(
(
Udowodnimy przez indukcjȩ, że po -tej iteracji zewnȩtrznej pȩtli wierzchołki o numerch od 1 do maja̧ już prawidłowe
wartości w macierzy . Po pierwszej iteracji ma prawidłowa̧ wartość
.
W
tej iteracji pȩtli (zakładamy, że wierzchołki o
numerach od 1 do
maja̧ już prawidłowe wartości w macierzy ) obliczamy .
Zauważmy, że najkrótsza droga z do przebiega przez wierzchołki o mniejszych od
numerach. Niech bȩdzie przedostatnim wierzchołkiem na tej drodze. Długość tej drogi
wynosi i zostanie odnaleziona w pȩtli.
Ponieważ mamy podwójne zagnieżdżenie
pȩtli
i w obu liczba iteracji jest ograniczona
przez , czas działania algorytmu jest
.
(
)
(
/
1 "/3 2< "/3
( (
Przykład 1.10 (kontynuacja przykładu 1.9) Jeżeli zastosujemy ten algorytm
do grafu
z
rysunku 1.4, to w kolejnych
iteracjach
zewnȩtrznej
pȩtli
obliczy
on
,
,
,
,
oraz .
) 1.6 Zadania
1. Narysuj wszystkie grafy skierowane ze zbiorem wierzchołków
z nich sa̧ spójne? Które z nich sa̧ izomorficzne?
. Które
Wskazówka: Definicja izomorfizmu grafów skierowanych jest taka sama jak dla
grafów nieskierowanych.
2. Które z grafów przedstawionych na rysunkach w tym rozdziale sa̧ spójne?
3. Narysuj możliwie jak najwiȩcej
nieizomorficznych grafów skierowanych z trzema
wierzchołkami .
4. Narysuj parȩ różnych i izomorficznych grafów skierowanych z możliwie najmniejsza̧
liczba̧ wierzchołków.
)
)
Rysunek 1.5: Graf skierowany
)
)
)
5. Zastosuj algorytm Dijkstry i znajdź najkrótsza̧ drogȩ z do w grafie z rysunku 1.5.
6. Zastosuj algorytm Forda-Bellmana do grafu z rysunku 1.5.
7. Znajdź najkrótsza̧ drogȩ z do w grafach z rysunków 1.3 i 1.4.
8. Zastosuj algorytm Forda-Bellmana do grafów z rysunków 1.3 i 1.4.
12
Rozdział 1. Grafy skierowane
1.7 Problemy
1.7.1 Cykl Eulera w grafie skierowanym
Cykl Eulera w grafie skierowanym jest to droga zamkni˛eta przechodzaca
˛ przez każda˛
kraw˛edź grafu dokładnie jeden raz. Udowodnij, że jeżeli graf skierowany jest spójny jako
graf nieskierowany, to ma cykl Eulera wtedy i tylko wtedy, gdy w każdym jego wierzchołku liczba kraw˛edzi wchodzacych
˛
jest równa liczbie kraw˛edzi wychodzacych.
˛
Jeżeli
w grafie jest p˛etla
, to liczymy ja˛ jako kraw˛edź wchodzac
˛ a˛ do i jako wychodzac
˛ a˛
z .
Zaproponuj algorytm wynajdywania cyklu Eulera w grafie skierowanym.
Które z grafów przedstawionych na rysunkach w tym rozdziale maja̧ cykle Eulera?
1.7.2 Ciag
˛ de Bruijna
bitów takie, że każdy ciag
˛
bitów
Ciag
˛ de Bruijna rz˛edu to cykliczne ustawienie
wyst˛epuje w tym cyklu
dokładnie
jeden
raz
jako
kolejnych
bitów.
Na przykład
ciag
˛
jest ciagiem
˛
de Bruijna rz˛edu 2 ( wyst˛epuje na pozycjach 4
i 1), aci
ag
˛
jest ciagiem
˛
de Bruijna rz˛edu 3 (
wyst˛epuje na pozycjach 7, 8 i
1, a
na pozycjach 8, 1 i 2).
Aby otrzymaż ciag
˛ de Bruijna
rz˛edu rozważmy nast˛epujacy
˛ graf skierowany G=(V,E).
Wierzchołki grafu
to zbiór wszystkich ciagów
˛
bitów długosci
. Dwa
wierzchołki
,
tworz
a
˛
kraw˛
e
dź,
wtedy
i
tylko
wtedy,
gdy
ostatnich
bitów jest takie samo jak pierwsze
bitów . Kraw˛edź ta jest etykietowana
ostatnim bitem .
Narysuj graf dla
, i .
Udowodnij, że:
)
) )))
))
% ) 0 !
4 4 )
))
:)
Graf jest spójny (jako graf nieskierowany) i posiada cykl Eulera.
Etykiety każdej drogi długości
tworza˛ nazw˛e ostatniego wierzchołka tej drogi.
Cykl Eulera ma
kraw˛edzi i przechodzi przez każdy wierzchołek dwa razy.
)
Etykiety cyklu Eulera tworza˛ ciag
˛ de Bruijna rz˛edu .
Wyznacz ciag
˛ de Bruijna rz˛edu .