Grafy (nieskierowane)

Komentarze

Transkrypt

Grafy (nieskierowane)
Matematyka Dyskretna
Andrzej Szepietowski
25 czerwca 2002 roku
Rozdział 1
Grafy (nieskierowane)
!"#$&'% #)(
+,-.# mówimy, że ła̧czy wierzchołki i , a o wierzchołkach i ,
O krawȩdzi *
01 , jest to liczba
że sa̧ końcami krawȩdzi * . Stopień wierzchołka , oznaczany przez /
krawȩdzi wychodza̧cych z .
Definicja 1.1 Graf (nieskierowany)
jest to para składaja̧ca siȩ ze skończonego zbioru wierzchołków
oraz ze zbioru krawȩdzi
, gdzie krawȩdzie to pary
wierzchołków.
Graf czȩsto przedstawiamy na rysunku jako zbiór punktów (lub kółek) poła̧czonych
odcinkami (lub łukami).
2
Rysunek 1.1: Przykład grafu
3
4
/
*
5
6
87&9:7;7 ze zbiorem wierzchołków
7 < 2 3 4 / * 5 6 7 = 2 3 >? 2 / >? 2 * )@ 2 6 ? 3 4 >? 4 6 >? 4 5 >@ / 5 )@ * 5 )@ 5 6 A .
3
Przykład 1.2 Rysunek 1.1 przedstawia graf
i zbiorem krawȩdzi
4
Rozdział 1. Grafy (nieskierowane)
2 i 5 wynosi 4, wierzchołki 4 i 6 sa̧ stopnia 3, wierzchołki 3 , / i
*
. , bȩdzie dowolnym grafem z krawȩdziami. Wtedy
Lemat 1.3 Niech
/ (
Dowód: Jeżeli policzymy wszystkie krawȩdzie wychodza̧ce
wierzchołków
, a z drugiejze wszystkich
A ponieważ
grafu, to z jednej
strony
mamy
sumȩ
/
jest liczona dwa razy, raz jak liczymy krawȩdzie wychodza̧cekażda
krawȩdz *
z i
drugi raz jak liczymy krawȩdzie wychodza̧ce z .
Wniosek 1.4 Liczba wierzchołków o nieparzystych stopniach jest parzysta.
. nazywamy podgrafem grafu . , jeżeli Graf
oraz
.
Przykład 1.5 Grafy
1.5 i 1.6 sa̧ podgrafami
; przedstawione
z rysukuna1.5rysunkach
<grafu
3 4 z rysun* 6 2
ku 1.1 . Graf
zawiera
sześć
wierzchołków
/
;
<
>
)
@
)
@
2 * 34 46 .
i trzy krawȩdzie
>
.
; 2 3 4 / * 5 6 Graf
z rysuku
1.6
zawiera
siedem
wierzchołków
>
?
>
?
)
@
)
@
?
2 3 2 / 2 * 2 6 34 / 5 .
i piȩć krawȩdzi
Stopień wierzchołkẃ
stopnia 2.
Graf pełny o wierzchołkach, oznaczany przez , jest to graf z wierzchołkami,
w którym każde dwa wierzchołki poła̧czone sa̧ krawȩdzia̧.
Rysunek 1.2: a) Graf pełny . b) Graf pełny dwudzielny a
b
c
d
e
f
a)
a
b
c
d
e
f
b)
+ :7 & :7 * 7 7 >7(?((? 7(?(?( 7
A8 Graf
jest dwudzielny,
jeżeli zbiór jego wierzchołków można rozbić na
!
#"
dwie czȩści
,
, tak, że każda krawȩdź
ma końce w
$ ma zbiór wierzchołków rozbity na
obu zbiorach
i . Pełny graf dwudzielny
&%
'%
$
dwa podzbiory:
i
, a krawȩdzie ła̧cza̧ każdy
)( *%,+ .-/102/ -/
wierzchołek
z
z
każdym
wierzchołkiem
z
,
czyli
3 /
.
1.1. Izomorfizm grafów
1.1 Izomorfizm grafów
. 0 5
Izomorfizmem grafu
na graf nazywamy funkcjȩ wza
jemnie jednoznaczna̧
spełniaja̧ca̧
warunek:
wtedy i tylko
wtedy, gdy
. Jeżeli taka funkcja istnieje, to mówimy, że grafy i sa̧ izomorficzne. Łatwo sprawdzić, że izomorfizm grafów jest relacja̧ równoważności.
). ze zbiorem
< 2 3 4 / = 2 3 >? 2 4 >@ 2 / >@ 3 4 >.
, z rysunku 1.4a jest izomorficzny z grafem . Izomorfizmem z Graf
określona nastȩpuja̧co: 2 4 , 3 3 , 4 ; 2 ,
na jest funkcja / /.
i . Graf zawiera
Graf
z rysunku 1.4b nie jest izomorficzny z grafami
wierzchołek / stopnia jeden, a w grafie
takiego wierzchołka nie ma.
Przykład 1.6 Rysunki 1.3a i 1.3b przedstawiaja̧ ten sam graf
wierzchołków
oraz zbiorem krawȩdzi
Rysunek 1.3: Rysunki a) i b) przedstawiaja̧ ten sam graf
a
c
b
a
d
b
d
c
a)
Rysunek 1.4: a) Graf
b)
izomorficzny z
. b) Graf
nieizomorficzny z
a
b
a
b
c
d
c
d
a)
b)
. na graf , to możemy
Jeżeli mamy izomorfizm grafu
powiedzieć, że jest takim samym grafem co
chołków.
Twierdzenie 1.7 Jeżeli grafy
tylko ze zmienionymi nazwami wierz-
= . i = . sa̧ izomorficzne, to:
6
Rozdział 1. Grafy (nieskierowane)
(a)
i
(b)
i
8 ,
8 ,
maja̧ tyle samo krawȩdzi,
maja̧ tyle samo wierzchołków,
(c) Dla każdego ,
i
maja̧ tyle samo wierzchołków stopnia .
Dowód:
(a) wynika bezpośrednio z definicji.
(b) Niech bȩdzie izomorfizmem z
na
. Ale określa także wzajemna̧ jednoznaczność pomiȩdzy zbiorem krawȩdzi
. (c) Udowodnimy, że jeżeli
jest stopnia , to i
jest stopnia . Wiȩc
odwzorowuje wierzchołki
stopnia
na
wierzchołki
stopnia
.
Niech , ... ,
bȩda̧
poła̧czonymi krawȩdziami z
wszystkimi wierzchołkami z
. Wtedy
, ... ,
sa̧ wszystkimi wierzchołkami z
poła̧czonymi krawȩdziami
.
z
< :@ 01 01 &
"& 07 )[email protected] 01
1.2 Drogi i cykle
>. 7 (?(?( 7
, 7
) ?(?((?.
7
.>7?((?(
7 (?(?(?
3
Przykład 1.8 W grafie
z rysunku
1.1
cia̧g * , 2 , / , 2 , , 4 , 6 jest droga̧, a cia̧g 2 , * , 5 , / , 2
3
4 6 2 jest droga̧ zamkniȩta̧, ale nie jest cyklem.
jest cyklem. Cia̧g 2 * 5 / 2
" istnieje ścieżka
Graf jest spójny, jeżeli dla każdych dwóch wierzchołków ,
ła̧cza̧ca i . Składowa spójności to maksymalny spójny podgraf
Zauważmy, że
i sa̧grafu.
=w
zbiorze
wierzchołków
grafu
istnieje
relacja
osia̧galności:
w
relacji
jeżeli
lub jest osia̧galny z . Relacja ta jest relacja̧ równoważności i dzieli zbiór wierzchołków
7 Droga
lub ścieżka w grafie jest
to cia̧g
wierzchołków
, taki,
że ( dla każdego
0 - / 0/
)(
(
)(
,
wierzchołki
,
sa̧
poła̧czone
krawȩdzia̧,
czyli
.O
drodze
mówimy,
że
ła̧czy
wierzchołki
i
.
Mówimy
także,
że
wierzcho
łek
jest osia̧galny z wierzchołka . Droga jest zamkniȩta jeżeli
. Droga jest
prosta, jeżeli wszystkie wystȩpuja̧ce
w
niej
wierzchołki
sa̧
różne.
Drogȩ
nazywamy cyklem jeżeli
, oraz wszystkie wierzchołki
sa̧ różne.
grafu na składowe spójności.
Przykład 1.9 Graf z rysunku 1.1 jest spójny, zawiera jedna̧ składowa̧ spójności (cały
graf).
Graf z rysunku 1.5 nie jest spójny i zawiera trzy składowe spójności:
7 ze zbiorem wierzchołków 2 * i jedna̧ krawȩdzia̧ 2 * 3 4 6 i dwoma krawȩdziami 3 4 i 4 6 ,
ze zbiorem wierzchołków
z jednym wierzchołkiem / i bez krawȩdzi.
% , to istnieje też droga
Lemat 1.10 Jeżeli
istnieje droga ła̧cza̧ca wierzchołki i ,
prosta ła̧cza̧ca i .
1.3. Drzewa
7
Rysunek 1.5: Graf z trzema składowymi spójności
2
3
4
/
*
6
< ) 7 ?((?(?. , bȩdzie najkrótsza̧ drogȩ ła̧cza̧ca̧ i . Droga
Dowód: Niech
, dla jakiegoś ; mielibyśmy wtedy
ta jest prosta. Przypuśćmy
że
7
(?(?( bowiem,
?
(
?
(
@
(
.
' , ła̧cza̧ca̧ i , wbrew założeniu.
krótsza̧ drogȩ
Dowolne dwa wierzchołki
moga̧ być poła̧czone dwoma drogami prostymi.
3 4 6 2 wnacyklu
3 4 oraz
2
Na przykład
w
cyklu
rysunku
1.1, wierzchołki 2 i 4 ła̧czy droga 2
2
4
droga 6 . Tak, wiȩc, jeżeli w grafie sa̧ cykle, to istnieja̧ pary wierzchołkow, które sa̧
poła̧czone dwoma drogami prostymi. Ale i na odwrót.
% które można poła̧czyć
Lemat 1.11 Jeżeli w grafie istnieja̧ dwa wierzchołki i ,
dwoma różnymi drogami prostymi, to w grafie istnieje cykl.
+ >7A?((?(@. + , 7A?((?(@ !+ , bȩda̧ dwoma rożDowód: Niech
>7 % 7 (w przeciwnymi prostymi drogami ła̧cza̧cymi i . Możemy założyć, że
bȩdzie pierwnym przypadku możemy
Niech
7
usuna̧ć wspólny pocza̧tek obudróg).
?
(
?
(
(
szym wierzchołkiem
po
, i niech
7
?
(
?
(
(
7 , który wystȩpuje w drodze
> 7 ?((?(
)?((?(@. .
Wierzchołki
wystȩpuja̧ w drodze
i droga
7 (?(?(? 7 nie tworzy
cykl
(w
drodze
tej
wystȩpuja̧
conajmniej
trzy różne
7
7
wierzchołki , oraz ).
( +
)(
+
0
3
%
'%
*%
%
(
% + '% +
'%
%
%
*%
*%
*%
%
'%
$
'%
$
(
)(
(
%,+
Z tego lematu wynika, że graf jest acykliczny (nie ma cykli) wtedy i tylko wtedy, gdy
każde dwa wierzchołki grafu można poła̧czyć co najwyżej jedna̧ droga̧ prosta̧.
1.3 Drzewa
Definicja 1.12 Spójny i acykliczny (bez cykli) graf to drzewo.
Z rozważań z poprzedniego podrozdziału wynika:
Lemat 1.13 Graf jest drzewem wtedy i tylko wtedy, gdy każde dwa jego wierzchołki można poła̧czyć dokładnie jedna̧ prosta̧ droga̧.
8
Rozdział 1. Grafy (nieskierowane)
Rysunek 1.6: Przykład drzewa
2
3
4
/
*
5
6
Twierdzenie 1.14 Nastȩpuja̧ce trzy warunki sa̧ równoważne:
(a) Graf
jest drzewem.
(b)
jest acykliczny, ale dodanie dowolnej krawȩdzi psuje acykliczność; dodana krawȩdź
wraz z innymi krawȩdziami grafu tworzy cykl.
(c)
jest spójny, ale usuniȩcie dowolnej krawȩdzi
krawȩdzi
nie ma drogi ła̧cza̧cej i .
psuje spójność; to znaczy bez
2 3 Ponieważ jest drzewem, wiȩc jest acykliczny, przypuśćmy, że dodanie
,-.# nie dodaje cyklu w grafie, ale to oznacza, że w grafie nie ma drogi
krawȩdzi ła̧cza̧cej i . W przeciwnym przypadku mielibyśmy dwie drogi proste z do : jedna,˛
Dowód:
która była w drzewie i druga˛ złożona˛ tylko z dodanej kraw˛edzi, a wi˛ec na podstawie
lematu 1.11 dodanie krawȩdzi zamykałoby cykl. Mamy sprzeczność, bo jako drzewo
jest spójny.
Trzeba pokazać, że jest spójny. Przypuśćmy, że nie jest, i że nie ma drogi
ła̧cza̧cej wierzchołki i . Ale wtedy dodanie krawȩdzi
nie dodaje cyklu (gdyby taki cykl powstał, to po usuniȩciu krawȩdzi
z cyklu mielibyśmy drogȩ prosta̧
łacza̧ca̧ i ).
jako drzewo jest spójny. Przypuśćmy, że odjȩcie krawȩdzi nie psuje spójności. To znaczy, że w grafie istniały dwie drogi proste ła̧cza̧ce i , czyli na podstawie
Lematu 1.11 w grafie jest cykl; sprzeczność.
Trzeba pokazać, że w nie ma cyklu. Gdyby w istniał cykl, to usuniȩcie
dowolnej krawȩdzi tego cyklu nie psuje spójności; sprzeczność.
3 2 2 4 ,-.#
,-.#
4 2 Lemat 1.15 W drzewie z wierzchołkami mamy -
krawȩdzi.
Dowód: Przez indukcjȩ ze wzglȩdu na liczbȩ wierzchołków. Jeżeli drzewo ma jeden
wierzchołek, to nie ma żadnych krawȩdzi.
1.4. Przeszukiwanie grafów
9
7 ?(?((?.
Załóżmy teraz, że twierdzenie zachodzi dla każdego drzewa maja̧cego mniej niż wierzchołków
i niech drzewo ma wierzchołków. W istnieje wierzchołek stopnia
. Rzeczywiście, weźmy drogȩ prosta̧ w o maksymalnej długości
.
Wierzchołek jest w grafie poła̧czony tylko z , bo inaczej mielibyśmy cykl lub dłuższa̧
drogȩ prosta̧. Usuńmy teraz z grafu wierzchołek
i prowadza̧ca̧ do niego krawȩdź.
wierzchołków
i z założenia indukcyjOtrzymany graf jest spójny i acykliczny ma nego krawȩdzi, czyli w grafie było krawȩdzi.
/ 01
)7
Twierdzenie 1.16 Niech
runki sa̧ równoważne:
(a) Graf
(b)
(c)
3 bȩdzie grafem z wierzchołkami, wtedy nastȩpuja̧ce trzy wa-
jest drzewem.
jest acykliczny i posiada jest spójny i posiada 2 -
-
krawȩdzi.
krawȩdzi.
Dowód: Na podstawie lematu 1.15 z (a) wynika (b) i (c).
jest acykliczny, przypuśćmy, że nie jest drzewem. Wtedy na podstawie
twierdzenia 1.14 można do niego dodać jaka̧ś krawȩdź nie psuja̧c acykliczności. Jeżeli tak powstały graf nie jest drzewem, to dodajemy kolejne krawȩdzie, aż dojdziemy do
acyklicznego grafu, w którym już żadnej krawȩdzi nie można dodać - bez dodania cyklu.
Tak powstały graf jest drzewem, ma wierzchołków i wiȩcej niż krawȩdzi. Doszliśmy wiȩc do sprzeczności z lematem 1.15.
jest spójny, przypuśćmy, że nie jest drzewem. Wtedy na podstawie twierdzenia 1.14 można z niego usuna̧ć jaka̧ś krawȩdź nie psuja̧c spójności. Jeżeli tak powstały
graf nie jest drzewem, to usuwamy kolejne krawȩdzie, aż dojdziemy do spójnego grafu,
z którego już żadnej krawȩdzi nie można usuna̧ć bez popsucia
spójności. Tak powstały
graf jest drzewem, ma wierzchołków i mniej niż krawȩdzi. Doszliśmy wiȩc do
sprzeczności z lematem 1.15.
4 2 Z powyższego
dowodu wynika, że spójny graf z wierzchołkami nie może mie ć
mniej niż krawȩdzi, czyli drzewo to spójny graf z minimalna̧ liczba̧ krawȩdzi.
Podobnie,
jeżeli graf ma wierzchołków i jest acykliczny, to nie może mieć wiȩcej niż
krawȩdzi, czyli drzewa to grafy acykliczne z maksymalna̧ liczba̧ krawȩdzi.
Przykład 1.17 W drzewie z rysunku 1.6 nie można usuna̧ć żadnej krawȩdzi bez rospójnienia grafu. Nie można też dodać żadnej krawȩdzi tak, aby nie powstał cykl. W grafie z
rysunku 1.1 można usuna̧ć krawȩdź
i graf nadal bȩdzie spójny. Do grafu z rysunku 1.5 można dodać krawȩdź
i nie powstanie żaden cykl.
2 3 2 3
1.4 Przeszukiwanie grafów
W rozdziale o strukturach danych zaprezentowano algorytmy przeszukiwania drzew w
gła̧b i wszerz. Po niewielkich modyfikacjach algorytmy te można zastosować do przeszukiwania grafów.
10
Rozdział 1. Grafy (nieskierowane)
= . oraz wierzchołek pocza̧tkowy Algorytm przeszukiwania grafu w gła̧b.
Dane wejściowe: graf
odwiedzamy
dzony,
i wkładamy go na STOS; zaznaczamy
;
jako wierzchołek odwie-
dopóki STOS nie jest pusty, powtarzamy:
jeżeli jest wierzchołkiem na wierzchu STOSU, to sprawdzamy, czy istnieje
wierzchołek , który jest poła̧czony krawȩdzia̧ z wierzchołkiem i nie był jeszcze
odwiedzony,
jeżeli takie siȩ znajdzie, to odwiedzamy , wkładamy go na wierzch STOSU i zaznaczamy jako wierzchołek odwiedzony,
jeżeli takiego nie ma, to zdejmujemy
chołka bȩda̧cego na STOSIE pod spodem.
ze STOSU i cofamy siȩ do wierz-
Rysunek 1.7: Przykład grafu
2
3
*
5
4
/
6
Przykład 1.18 Zastosujmy algorytm przeszukiwania w gła̧b do grafu z rysunku 1.7. Poniższa tabela pokazuje jaki wierzchołek jest odwiedzany i jaka jest zawartość stosu po
każdej kolejnej iteracji pȩtli algorytmu (przeszukanie zaczynamy od wȩzła ). Przyjȩto
zasadȩ, że jeżeli jest kilka wierzchołków do wyboru, to wybieramy ten, którego nazwa stoi
wcześniej w alfabecie.
2
1.4. Przeszukiwanie grafów
Wierzchołek
a
b
c
d
c
g
f
g
c
b
e
b
a
11
STOS
a
ab
abc
abcd
abc
abcg
abcgf
abcg
abc
ab
abe
ab
a
W metodzie przeszukiwania w gła̧b po każdym kroku algorytmu wierzchołki znajduja̧ce
siȩ na stosie tworza̧ drogȩ od wierzchołka wejściowego do wierzchołka aktualnie odwiedzanego.
Udowodnimy teraz, że algorytm odwiedzi wszystkie wierzchołki osia̧galne
z wierz%
chołka pocza̧tkowego . Przypuśćmy bowiem, że
w
grafie
istnieje
wierzchołek
osia̧galny
%
z , ale nie odwiedzony przez algorytm. Skoro jest osia̧galny z , to istnieje droga
' >7A?((?(@. (
odwiedzony, a nie, to na tej drodze
Ponieważ
dwa sa̧siednie wierzchołki
oraz 7 był
był odwiedzony, a 7 nie. Wmamy
takie,
że
pewnym
momencie algorytmu
wierzchołek był na stosie, a potem został z niego zdjȩty, ponieważ algorytm ko ńczy
pracȩ dopiero po zdjȩciu wszystkich
stosu. Zastanówmy
siȩ teraz nad
wierzchołkówzezestosu.
nie mógł być
Ale
zdjȩty ze
krokiem algorytmu, w którym jest zdejmowany
7 , który nie był odwiedzony.
stosu, ponieważ istnieje jego sa̧siad
%
(
(
(
)(
)(
)(
)(
(
Aby udowodnić, że algorytm zawsze siȩ zatrzyma wystarczy zauważyć, że w każdej
iteracji pȩtli albo jakiś wierzchołek jest wkładany na stos, albo jakiś jest zdejmowany ze
stosu. Z drugiej strony każdy wierzchołek jest tylko raz wkładany
na stos
(bo wkładane
sa̧ tylko wierzchołki nieodwiedzane). Mamy wiȩc nie wiȩcej niż iteracji pȩtli,
a ponieważ w każdej pȩtli algorytm wykonuje tylko kilka kroków, wiȩc czas działania
algorytmu jest rzȩdu .
8 . oraz wierzchołek pocza̧tkowy ;
odwiedzamy , wkładamy go do KOLEJKI; zaznaczamy jako wierzchołek od-
Algorytm przeszukiwania wszerz.
Dane wejściowe: graf
wiedzony,
dopóki KOLEJKA nie jest pusta, powtarzamy:
bierzemy jeden wierzchołek z pocza̧tku KOLEJKI,
12
Rozdział 1. Grafy (nieskierowane)
odwiedzamy wszystkie wierzchołki, które nie były jeszcze odwiedzane, a sa̧
poła̧czone krawȩdzia̧ z wierzchołkiem , wkładamy je na koniec kolejki i zaznaczamy jako odwiedzone.
Przykład 1.19 Poniżej przedstawiono odwiedzane wierzchołki oraz zawartość kolejki po
każdej kolejnej iteracji pȩtli algorytmu przeszukiwania wszerz dla grafu przedstawionego
na rysunku 1.7 (przeszukanie zaczynamy od wȩzła ):
2
wierzchołki
a
b,c,d,e
f
g
-
KOLEJKA
a
bcde
cdef
defg,
efg,
fg,
g,
"
W metodzie przeszukiwania wszerz wierzchołki sa̧ przeszukiwane w kolejności od wierzchołków bȩda̧cych najbliżej wierzchołka pocza̧tkowego do wierzchołków bȩda̧cych dalej.
1.5 Liczenie składowych spójności
Algorytmu przeszukiwania grafów można użyć do liczenia składowych spójności.
. .
Algorytm liczenia składowych spójności grafu
Dane wejściowe: graf
Dane wyjściowe: liczba składowych spójności — .
lsp:=0;
Powtarzaj dopóki sa̧ jeszcze nieodwiedzone wierzchołki w grafie:
Weź jeden nieodwiedzony jeszcze wierzchołek ; lsp:=lsp+1;
przeszukaj (za pomoca̧ algorytmu przeszukiwania grafu w gła̧b) wszystkie
wierzchołki osia̧galne z i zaznacz je jako odwiedzone.
1.6 Drzewa spinaja̧ce
. -
, to dowolne drzewo
Definicja
1.20 Drzewo spinaja̧ce (rozpinaja̧ce)
grafu
spełniaja̧ce warunek
(zauważmy, że
chołków co ).
ma taki sam zbiór wierz-
Przykład 1.21 Drzewo z rysunku 1.6 jest drzewem spinaja̧cym dla grafu z rysunku 1.1.
1.6. Drzewa spinaja̧ce
Jeżeli graf
13
nie jest spójny, to nie ma drzewa spinaja̧cego. Z drugiej strony.
Twierdzenie 1.22 Każdy graf spójny zawiera jako podgraf drzewo spinaja̧ce.
Jako dowód przedstawimy algorytmy konstruowania drzewa spinaja̧cego. W tym celu
lekko przerobimy algorytm przeszukiwania grafów w gła̧b.
==. na pocza̧tku drzewo spinaja̧ce nie zawiera żadnych krawȩdzi:
odwiedzamy i wkładamy go na STOS; zaznaczamy jako wierzchołek odwie-
Algorytm konstruowania drzewa spinaja̧cego przy przeszukiwania grafu w gła̧b.
oraz wierzchołek pocza̧tkowy
;
Dane wejściowe: graf
Dane wyjściowe: drzewo spinaja̧ce
.
. "
dzony,
dopóki STOS nie jest pusty, powtarzamy:
jeżeli jest wierzchołkiem na wierzchu STOSU, to sprawdzamy, czy istnieje
wierzchołek , który jest poła̧czony krawȩdzia̧ z wierzchołkiem i nie był jeszcze
odwiedzony,
-
jeżeli takie siȩ znajdzie, to odwiedzamy , wkładamy go na wierzch STOSU i zaznaczamy jako wierzchołek odwiedzony, krawȩdź
dodajemy do drzewa spinaja̧cego:
jeżeli takiego nie ma, to zdejmujemy
chołka bȩda̧cego pod spodem.
ze STOSU i cofamy siȩ do wierz-
Rysunek 1.8: Drzewo spinaja̧ce dla grafu z rysunku 1.7
2
4
3
*
5
/
6
Przykład 1.23 Rysunek 1.8 przedstawia drzewo spinaja̧ce utworzone przez powyższy algorytm dla grafu z rysunku 1.7
14
Rozdział 1. Grafy (nieskierowane)
Pokażemy teraz, że algorytm jest poprawny, czyli że tak utworzony graf jest drzewem. Zauważmy, że jeżeli wierzchołek (poza pocza̧tkowym) jest wkładany na stos,
to do dokładana jest krawȩdź ła̧cza̧ca z wierzchołkiem znajduja̧cym siȩ na
stosie
pod nim. Dlatego w każdym momencie wierzchołki na stosie stanowia̧ drogȩ w , ła̧czy
ona wierzchołek pocza̧tkowy z aktualnie odwiedzanym wierzchołkiem.
Ponieważ graf
jest spójny, to algorytm odwiedzi wszystkie wierzchołki grafu i jest grafem spój
nym. Z każda̧ krawȩdzia̧ z możemy zwia̧zać wierzchołek, który jest wkładany na stos
w momencie jej powstania.
Ponieważ, każdy wierzchołek jest wkładany na stos tylko
raz, mamy w krawȩdzi (z pocza̧tkowym wierzchołkiem nie jest zwia̧zana żadna
krawȩdź). Tak wiȩc jest spójny, zawiera wszystkie wierzchołki grafu i ma krawȩdzi, jest wiȩc drzewem spinaja̧cym.
Podobnie można przerobić algorytm przeszukiwania grafu wszerz. Mówia̧c w skrócie
do drzewa należa̧ te krawȩdzie, którymi przeszedł algorytm przeszukuja̧c graf.
1.7 Fundamentalny zbiór cykli
Niech
bȩdzie spójnym grafem, a
jego drzewem spinaja̧cym. Krawȩdzie drzewa
bȩdziemy nazywali gałȩziami, a krawȩdzie nie należa̧ce do drzewa ciȩciwami.
Z twierdzenia 1.14 wynika, że dodanie dowolnej ciȩciwy do drzewa utworzy cykl.
). Zbiór tak utworzonych cykli stanowi
Oznaczmy ten cykl przez (oczywiście
fundamentalny zbiór cykli. Jak za chwilȩ pokażemy, każdy inny cykl w grafie jest różnica̧
symetryczna̧ cykli fundamentalnych. W tym podrozdziale cykle bȩdziemy traktowa ć jako
zbiory krawȩdzi.
*
*
57 2 3 5 3
5 2 *
* * 5 7 5 5 2 3 4 / 2 *
3 4 5 <
*7 2 4
5 5 5 A!
4/ * 3465 3
Przykład 1.24 Rozpatrzmy graf z rysunku 1.7 i jego drzewo spinaja̧ce z rysunku
1.8.
,
,
,
W tym przypadku gałȩziami sa̧ krawȩdzie:
,
,
,
a
ciȩciwami
krawȩdzie
,
, ,
. Fundamentalny
zbiór cykli zawiera
cykle: , , ,
,
5 '2 4 6 5 3 5 * 7,/ 5 7 * 5 ! 2 3 4?2
*575 5 6 * 23*2
grafu nazywamy pseudocyklem, jeżeli każdy wierzchołek grafu
Zbiór
jestkrawȩdzi
parzystego stopnia. Przykładami pseudocykli sa̧ cykle i zbiór pusty.
7
<
7
Lemat 1.25 Różnica symetryczna dowolnej liczby pseudocykli jest pseudocyklem.
Dowód:
Wystarczy pokazać, że różnica symetryczna
dwóch pseudocykli ,
jest pseudocyklem.
Dla
dowolnego
wierzchołka
zbiór
krawȩdzi przyległych
jest różnica̧ symetryczna̧ krawȩdzi przyległych do
do w
w
iw .A
ponieważ sa̧ to zbiory parzystej mocy, wiȩc ich różnica symetryczna też jest parzystej
mocy. Rzeczywiście dla dowolnych dwóch zbiorów i mamy
7
> !
# 7
!
(
1.7. Fundamentalny zbiór cykli
Weźmy teraz dowolny cykl (lub pseudocykl)
grafu
(
15
i utwórzmy róznicȩ
Jest to różnica symetryczna cykli fundamentalnych utworzonych z ciȩciw wchodza̧cych
do . Pokażemy, że
W tym celu rozważmy zbiór
(
(
*
Na podstawie lematu 1.25, zbiór ten jest pseudocyklem. Z drugiej strony
nie zawie
ra żadnych ciȩciw, ponieważ każda ciȩciwa albo nie należy do żadnego składnika tej
różnicy, jeżeli , albo należy do dokładnie dwóch: do i do . Zatem zbiór
bo inaczej musiałby zawierać wierzchołki stopnia
jest podzbiorem drzewa , i jest pusty,
jeden, co jest sprzeczne z faktem, że jest pseudocyklem. Zatem
*
(
Udowodniliśmy zatem nastȩpuja̧ce:
Twierdzenie 1.26 Każdy cykl (pseudocykl) jest różnica̧ pewnej liczby cykli fundamentalnych.
* 7 * 5 A< 2 4 / 2 jest różnica̧
* 7, * 5 = * 7, 5 7 5 ' * 5 7 5 5 ; 7 > A 2 4 6 5 3 * 2 jest różnica̧ symetryczna̧ cykli , i .
Cykl * 5 5 * 5 *
Rzeczywiście
* 7 5 5 * A 5 * = * 7 5 7 5 * 5 A 5 A 5 * A 5 7 5 ; (
Przykład 1.27 (Kontynuacja przykładu 1.24) Cykl
symetryczna̧ cykli i . Rzeczywiście
Lemat 1.28
Jeżeli graf jest spójny oraz posiada wierzchołków i cykli fundamentalnych.
Dowód: Wynika, to z faktu, że drzewo spinaja̧ce ma 7
-
krawȩdzi, to ma
krawȩdzi
Jeżeli graf nie jest
spójny, to każda̧ składowa̧ spójności możemy traktowć osobno.
(
(
Niech
,
, ... ( ,
bȩda̧ składowymi spójności grafu
i niech składowa ( ma( (
wierzchołków i krawȩdzi.
Dla każdej składowej
mamy drzewo spinaja̧ce z (
( krawȩdziami oraz cykli fundamentalnych. Niech zbiór cykli fundamentalnych
całego grafu bȩdzie suma̧ cykli fundamentalnych składowych. Każdy cykl w grafie należy
16
Rozdział 1. Grafy (nieskierowane)
w całości do jednej składowej spójności, bo sam jest spójny, i może być przedstawiony
jako różnica symetryczna cykli fundamentalnych. W całym grafie mamy wiȩc
(
7 (
(
, -
cykli fundamentalnych. Udowodniliśmy wiȩc nastȩpuja̧ce
cykli fundamentalnych,
Twierdzenie 1.29 W dowolnym grafie mamy gdzie jest liczba̧ wierzchołków, liczba̧ krawȩdzi, a liczba̧ składowych spójności.
Aby przekonać siȩ, czy graf
graf nie ma cykli.
ma cykl wystarczy policzyć i jeżeli 1.8 Minimalne drzewo spinaja̧ce
*
, to
* %
Wyobraźmy sobie, że każda krawȩdź w grafie
ma długość
. Na przykład, wierzchołki grafu sa̧ miejscowościami i długość krawȩdzi jest odległościa̧ miejscowości. Chcemy
teraz skonstruować minimalne drzewo spinaja̧ce, czyli drzewo spinaja̧ce
z minimalna̧ suma̧ długości krawȩdzi
. * (
%
. z funkcja̧ wagi .
=. .
Dane wyjściowe: minimalne drzewo spinaja̧ce
Posortuj krawȩdzie grafu według długości, od najkrótszej do najdłuższej.
Dla każdej krawȩdzi * wstaw ja̧ do . pod warunkiem, że nie tworzy ona
cyklu z krawȩdziami, które już sa̧ w
Algorytm budowy minimalnego drzewa spinaja̧cego
%
Dane wejściowe: graf
"
Przykład 1.30 Po zastosowaniu powyższego algorytmu do grafu z rysunku 1.9a otrzymamy drzewo przedstawione na rysunku 1.9b
Najpierw pokażemy, że tak utworzony graf jest drzewem spinaja̧cym. Po każdej
iteracji pȩtli, graf nie zawiera cyklu, wiȩc na końcu też jest acykliczny. Przypuśćmy,
że po zakończeniu algorytmu nie jest spójny.
Istnieja̧ wiȩc w dwa wierzchołki i ,
które sa̧ poła̧czone w droga̧ (bo jest spójny),
ale które nie sa̧
(
(
poła̧czone w . Na drodze tej sa̧ wiȩc dwa sa̧siednie wierzchołki
i
, które nie sa̧
( (
poła̧czone w droga̧. Ale wtedy dodanie kraw˛edzi( ( do drzewa nie tworzy w
nim cyklu i algorytm powinien dodać krawȩdź do , sprzeczność.
7((?( 7
7
7
1.9. Cykle i drogi Eulera
17
Rysunek 1.9: a) Graf z wagami, b) Jego minimalne drzewo spinaja̧ce
16
a
6
13
a
b
7
6
13
9
c
8
d
8
11
10
19
e
e
f
f
a)
7
c
d
11
b
:
b)
spinaja̧cym. Przypuśćmy, że nie
Pokażemy teraz, że jest minimalnym
bȩdzie drzewem
jest minimalne. Niech
takim minimalnym drzewem, które ma z
najwiȩksza̧ liczbȩ wspólnych krawȩdzi. Niech bȩdzie krawȩdzia̧ z minimalna̧ waga̧,
która należy do , ale nie należy do . Jeżeli dodamy do to otrzymamy cykl. Niech
bȩdzie krawȩdzia̧ w tym cyklu, która należy do , ale nie należy do .
Niech bȩdzie drzewem,
powstaje z po zamianie
na . powstaje przez
które
usuniȩcie z grafu
. Jest to graf spójny z krawȩdziami, czyli drzewo.
%
%
Jeżeli
, to drzewo
byłoby drzewem z mniejsza̧ od waga̧, wbrew mi%
%
nimalności . Jeżeli
, to drzewo byłoby minimalnym drzewem
%
z% wiȩksza̧
od liczba̧ wspólnych z krawȩdzi, znowu sprzeczność. Mamy wiȩc
.
Jeżeli dodamy
teraz
krawȩdź
do
,
to
otrzymamy
cykl
(to
może
być
inny
cykl
).
W
tym
cyklu
istnieje
krawȩdź
,
która
należy
do
,
ale
nie
niż ten w
%
%
do . Przypuśćmy, że . W takim przypadku algorytm powinien wstawić
krawȩdź do drzewa , bo w momencie rozpatrywania w drzewie
nie ma jeszcze i wstawienie nie zamyka cyklu. Wynika, to z faktu, że graf
jest
drzewem,
wiȩc
krawȩdź
nie
tworzy
cyklu
z
krawȩdziami
z
.
Mamy
wiȩc
%
%
co jest sprzeczne z faktem, że była najlżejsza̧ krawȩdzia̧ z i
/ %
nienależa̧ca̧ do .
5
. 5 * 5 *
* 5 5
. * 5 * 5
5
* 5 * 5
*
*
5 *
*
*
* 5 5 *
* 5 *
1.9 Cykle i drogi Eulera
Droga Eulera to droga, która przechodzi przez każda̧ krawȩdź grafu dokładnie jeden raz.
Cykl Eulera to taka droga zamkniȩta, w której każda krawȩdź grafu wystȩpuje dokładnie
raz.
Euler w 18. wieku pokazał, że istnieje dość prosta charakteryzacja grafów z droga̧
lub cyklem Eulera. Mianowicie spójny graf posiada cykl Eulera, wtedy i tylko wtedy gdy
każdy jego wierzchołek jest parzystego stopnia, a posiada drogȩ Eulera jeżeli co najwyżej
18
Rozdział 1. Grafy (nieskierowane)
dwa jego wierzchołki sa̧ stopnia nieparzystego. Pamiȩtamy, wniosek 1.4, że w każdym
grafie liczba wierzchołków nieparzystego stopnia jest parzysta. Tak wiȩc graf z droga̧
Eulera ma dwa lub zero wierzchołków nieparzystego stopnia.
432 * 5 46 2 / 5 6
Przykład 1.31 Graf na rysunku 1.1 ma dwa wierzchołki nieparzystego stopnia
posiada drogȩ Eulera
.
4 i6
i
Wyobraźmy sobie, że idziemy wzdłuż krawȩdzi grafu, i po przejściu każdej krawȩdzi
usuwamy ja̧ z grafu. Przechodza̧c przez jakiś wierzchołek usuwamy dwie krawȩdzie, ta̧,
która̧ weszliśmy do wierzchołka, i ta̧, która̧ go opuściliśmy. Dlatego, jeżeli po dojściu do
jakiegoś wierzchołka, nie ma już krawȩdzi z niego odchodźa̧cych, to albo doszliśmy do
wierzchołka pocza̧tkowego, albo do wierzchołka nieparzystego stopnia.
Z tego wynika, że jeżeli w grafie istnieje droga Eulera, to moga̧ w nim być co najwyżej
dwa wierzchołki nieparzystego stopnia, pocza̧tek i koniec drogi, a jeżeli droga Eulera jest
zamkniȩta i stanowi cykl Eulera, to wszystkie wierzchołki w grafie sa̧ parzystego stopnia.
Pokażemy teraz, że sa̧ to także warunki wystarczaja̧ce. Zaczniemy od cyklu Eulera.
Twierdzenie 1.32 Spójny graf posiada cykl Eulera wtedy i tylko wtedy, gdy każdy jego
wierzchołek jest parzystego stopnia.
Dowód: Konieczność warunku udowodniliśmy wyżej. Teraz pokażemy, że jest to warunek wystarczaja̧cy. Załóżmy, że każdy wierzchołek jest parzystego stopnia. Niech
bȩdzie najdłuższa̧ pod wzglȩdem liczby krawȩdzi droga̧ w grafie bez powtarzania krawȩdzi.
Z rozważań zrobionych wyżej wynika, że jest to droga zamkniȩta. Przypuśćmy, że droga
ta nie zawiera jeszcze wszystkich krawȩdzi grafu. Ponieważ graf jest spójny, wiȩć istnieje
wierzchołek na tej drodze, od którego odchodzi krawȩdź nie należa̧ca do . Możemy teraz utworzyć dłuższa̧ drogȩ bez powtarzania krawȩdzi: zawiera ona i potem idzie
wzdłuż . Jest to sprzeczne z założeniem, że była najdłuższa̧ droga̧.
*
*
Twierdzenie 1.33 Spójny graf posiada drogȩ Eulera wtedy i tylko wtedy, gdy posiada co
najwyżej dwa wierzchołki nieparzystego stopnia.
Dowód: Konieczność warunku pokazano wyżej. Teraz pokażemy, że jest to warunek
wystarczaja̧cy. Ponieważ graf nie może posiadać tylko jednego wierzchołka stopnia nieparzystego, to wystarczy rozważyć graf z dwoma wierzchołkami i nieparzystego stopnia.
Dodajmy do grafu nowy wierzchołek i poła̧czmy go krawȩdziami z i . Teraz każdy
wierzchołek jest stopnia parzystego i posiada cykl Eulera. Po usuniȩciu z niego nowych
krawȩdzi i wierzchołka otrzymamy drogȩ Eulera w pierwotnym grafie.
Powyższy dowód, chociaż krótki, ma tȩ wadȩ, że nie daje dobrego algorytmu znajdowania drogi Eulera. Nie sposób przegla̧da̧ć wszystkich możliwych dróg, bo jest ich
bardzo dużo.
Poniżej pokażemy dwa znacznie szybkie algorytmy znajdowania cyklu Eulera.
Algorytm wyszukiwania cyklu Eulera
Dane wejściowe: spójny graf ze wszystkimi wierzchołkami parzystego stopnia.
Zaczynamy od dowolnego wierzchołka .
1.9. Cykle i drogi Eulera
19
Powtarzamy, aż do wyczerpania krawȩdzi:
Jeżeli z bierza̧cego wierzchołka
algorytmu.
nie odchodzi żadna krawȩdź, to koniec
Jeżeli z bierza̧cego wierzchołka odchodzi tylko jedna krawȩdź, to przechodzimy wzdłuż tej krawȩdzi do nastȩpnego wierzchołka, usuwamy ta̧ krawȩdź i
wierzchołek z grafu.
Jeżeli z odchodzi wiȩcej niż jedna krawȩdź, to wybieramy ta̧ krawȩdź, której usuniȩcie nie rozspójnia grafu; przechodzimy wzdłuż tej krawȩdzi do nastȩpnego
wierzchołka, usuwamy ta̧ krawȩdź z grafu.
Rysunek 1.10: Przykład grafu z cyklem Eulera
2
3
4
/
*
0
5
6
2
Przykład 1.34 W grafie z rysunku 1.10 wszystkie wierzchołki sa̧ parzystego stopnia. Prześledźmy, jak działa powyższy algorytm. Zaczynamy od wierzchołka i przyjmijmy, że w
razie wyboru algorytm wybierze krawȩdź do wierzchołka z wcześniejsza̧ (według alfabetu) litera̧. Tak wiȩc przejdzie do potem do i do . Rysunek 1.11 przedstawia nasz graf
po tych trzech krokach, usuniȩciu odwiedzanych krawȩdzi i wierzchołka (z którego nie
odchodza̧ już żadne krawȩdzie).
ponieważ usuniȩcie tej krawȩdzi rozTeraz algorytm nie może wybrać krawȩdzi
spójni graf. Zamiast tego algorytm powinien wybrać krawȩdź
i przejść do wierzchołka , a potem do . Teraz znowu 0 nie powinien iść do tylko do , a potem już bez
problemów do końca cyklu Eulera: , , , , , .
3
2
/
/ 2 5
*
4
3 5 6 / 2
6
4
/ * Pokażemy teraz poprawność tego algorytmu. Przypuśćmy, że po kilku krokach jesteśmy w wierzchołku , z którego odchodzi kilka krawȩdzi. Pokażemy, że wśród tych
krawȩdzi co najwyżej jedna jest zła (jej usuniȩcie może rozspójnić graf). Z przebiegu
algorytmu wynika, że graf w aktualnej postaci (po usuniȩciu być może jakiś krawȩdzi
lub wierzchołków)
dwa wierzchołki w nim sa̧ nieparzy jest nadal spójny i co najwyżej
stego stopnia i
(co zachodzi jeżeli
). Wiȩc posiada on drogȩ Eulera. Idźmy
% 20
Rozdział 1. Grafy (nieskierowane)
Rysunek 1.11: Graf po przejściu trzech krawȩdzi
2
3
/
*
0
5
6
ta̧ droga̧ zaczynaja̧c od . Droga ta kończy siȩ w lub
i przechodzi kilka razy przez
. Mamy wiȩc kilka pȩtli, które zaczynaja̧
siȩ
i
ko
ńcza̧
w
i być może końcowy odci
nek zaczynaja̧cy siȩ w i kończa̧cy w . Otóż tylko pierwsza krawȩdź tego ostatniego
odcinka może rozspójniać graf. Wszystkie inne krawȩdzie wychodza̧ce z sa̧ czȩściami
cykli.
Aby udowodnić, że algorytm dobrze działa, trzeba pokazać, że wszystkie krawȩdzie
grafu bȩda̧ odwiedzone. Po każdej iteracji algorytmu graf jest spójny, wiȩc jeżeli z wierzchołka nie odchodza̧ żadne krawȩdzie, to znaczy, że nie ma już żadnych krawȩdzi w
grafie.
Powyższy algorytm mimo, że prosty i szybki wymaga sprawdzania, czy usuniȩcie
krawȩdzi nie rozspójni grafu.
Drugi algorytm wyznaczania cyklu Eulera.
Dane wejściowe: spójny graf, w którym wszystkie wierzchołki sa̧ parzystego stopnia.
Pomocniczy STOS.
Dane wyjściowe: CE — cykl Eulera.
Zaczynamy od dowolnego wierzchołka i wkładamy go na STOS,
Natȩpnie powtarzamy dopóki STOS nie jest pusty
bȩdzie wierzchołkiem z wierzchu STOSU
jeżeli z odchodza̧ jakieś nieodwiedzane krawȩdzie, to wybieramy jedna̧ z
Niech
nich, przechodzimy na jej drugi koniec, zaznaczamy jako odwiedzona̧ i jej drugi
koniec wkładamy na STOS.
Jeżeli wszystkie krawȩdzie odchodza̧ce z były już odwiedzone, to zdejmu
jemy ze STOSU, przekładamy
na wyjście CE oraz przechodzimy do wierzchołka
znajduja̧cego siȩ pod na STOSIE.
1.10. Drogi i cykle Hamiltona
21
Przykład 1.35 Prześledźmy działanie algorytmu na przykładzie z rysunku 1.10. Poniższa
tabela zawiera: odwiedzany wierzchołek, stan STOSU oraz stan pliku wyjściowego CE po
każdym kroku z pierwszych szesnastu kroków.
Krok
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
wierzchołek
a
b
c
d
a
d
e
f
g
d
g
f
h
b
i
f
STOS
a
ab
abc
abcd
abcda
abcd
abcde
abcdef
abcdefg
abcdefgd
abcdefg
abcdef
abcdefh
abcdefhb
abcdefhbi
abcdefhbif
CE
a
a
a
a
a
ad
adg
adg
adg
adg
adg
Po szesnastu krokach wszystkie krawȩdzie zostały odwiedzone i teraz STOS krok po
kroku zostanie przełożony na wyjście CE. Otrzymamy nastȩpuja̧cy cykl Eulera:
2 / 6 5 3 5 */ 4 3 2 (
0
Z algorytmu wynika, że kolejne wierzchołki na obu stosach sa̧ poła̧czone krawȩdziami
i że każda krawȩdź (jako para sa̧siednich wierzchołków) pojawia siȩ na STOSIE tylko
raz. Należy wiȩc tylko pokazać, że wszystkie krawȩdzie znajda̧ sie na wyjściu. Jeżeli
pominiȩto jakieś krawȩdzie, to ponieważ graf jest spójny jakaś nieodwiedzona krawȩdź
musi przylegać do wierzchołka , który jest w wynikowym cyklu, ale jest przekładany
na wyjście tylko tedy, gdy nie odchodza̧ od niego już żadne nieodwiedzane krawȩdzie.
W każdej iteracji algoryt przechodzi jaka̧ś krawȩdź. Albo wkładaja̧c jej koniec na
STOS, albo przekładaja̧c ja̧ na wyjście CE. A ponieważ każda krawȩdź jest odwiedzana
dokładnie dwa razy, raz jak jest wkładana na STOS i drugi raz jak jest przekładana na CE,
wiȩc czas działania algorytmu jest proporcjonalny do liczby krawȩdzi w grafie.
1.10 Drogi i cykle Hamiltona
Droga Hamiltona to taka droga w grafie, która przechodzi dokładnie raz przez każdy
wierzchołek grafu. Cykl Hamiltona to zamkniȩta droga Hamiltona.
/ 2 346 5 *
Przykład 1.36 Graf z rysunku 1.1 posiada drogȩ Hamiltona
, ale nie posiada cyklu Hamiltona. Każdy graf pełny z posiada cykl Hamiltona.
22
Rozdział 1. Grafy (nieskierowane)
Inaczej niż dla cyklu lub drogi Eulera nie jest znane żadne proste kryterium rozstrzygania, czy dany graf posiada drogȩ lub cykl Hamiltona. Nie jest także znany żaden algorytm wyszukiwania drogi lub cyklu Hamiltona działaja̧cy w czasie wielomianowym.
Naiwnym sposobem szukania drogi Hamiltona jest sprawdzanie wszystkich możliwych
dróg w grafie, ale algorytm ten jest bardzo czasochłonny, bo mamy około możliwych
dróg w grafie z wierzchołkami.
Innym algorytmem szukania drogi Hamiltona jest tak zwane wyszukiwanie z nawrotami. Mówia̧c w skrócie szukanie z nawrotami idzie pierwsza̧ możliwa̧ ścieżka̧ tak daleko
jak to tylko możliwe okładaja̧c kolejne odwiedzane wȩzły na stos. W momencie, gdy algorytrm utknie w ślepej uliczce, to cofa siȩ o jeden krok i próbuje innej drogi. Załóżmy,
że wierzchołki grafu sa̧ uporza̧dkowane
na przykład według alfabetu lub sa̧ kolejnymi
liczbami naturalnymi
= (?((@ Algorytm z nawrotami wyszukiwania drogi Hamiltona
. oraz wierzchołek pocza̧tkowy " .
Dane wyjściowe: droga Hamiltona zaczynaja̧ca siȩ od , lub informacja, że takiej drogi
Dane wejściowe: graf
nie ma.
włóż na STOS
powtarzaj aż do skutku:
jeżeli jest wierzchołkiem na wierzchu STOSU, to szukamy wierzchołka
o najniższym możliwie numerze poła̧czonego z krawȩdzia̧ i nie wystȩpuja̧cy
%
na STOSIE. Jeżeli w poprzedniej iteracji zdjȩto ze STOSU wierzchołek , to
powinien być wiȩkszy od .
%
%
Jeżeli takie znajdziemy, to wkładamy je na STOS. Jeżeli wierzchołki na
STOSIE tworza̧ już drogȩ Hamiltona, to koniec algorytmu.
Jeżeli takiego
%
nie znajdziemy, to zdejmujemy
ze STOSU.
Przykład 1.37 Prześledźmy działanie algorytmu na przykładzie grafu z rysunku 1.1. Poniższa tabela zawiera: odwiedzany wierzchołek, oraz stan STOSU po każdym kolejnym
kroku (szukanie rozpoczynamy od wierzchołka ).
/
1.11. Kolorowanie grafów
Krok
1
2
3
4
5
6
7
8
9
10
11
12
13
wierzchołek
d
a
b
c
f
e
f
g
f
c
g
f
e
23
STOS
d
da
dab
dabc
dabcf
dabcfe
dabcf
dabcfg
dabcf
dabc
dabcg
dabcgf
dacgfe
Powyższy algorytm mimo, że szybszy od naiwnego algorytmu sprawdzania wszystkich dróg, ma wykładnicza̧ złożoność czasowa̧.
1.11 Kolorowanie grafów
Chodzi o takie pokolorowanie wierzchołków grafu, żeby wierzchołki poła̧czone krawȩdzia̧
były pokolorowane innymi kolorami i żeby liczba kolorów była jak najmniejsza.
4 0 ; % 4 0 1
>?((?(@ ,-.# 4 Definicja
1.38 Pokolorowanie grafu
kolorami jest to funkcja
, taka że
jeżeli
.
Najmniejsze takie , że graf
można pokolorować kolorami nazywamy liczba̧
chromatyczna̧ grafu i oznaczamy przez
.
W przypadku kolorowania grafów, podobnie jak dla dróg Hamiltona, nie sa̧ znane dobre i szybkie algorytmy. Naiwny algorytm sprawdzaja̧cy wszystkie możliwe kolorowania
działa zbyt długo. Także tu mamy algorytm z nawrotami.
==. Algorytm z nawrotami kolorowania wierzchołków grafu
Dane wejściowe: graf
oraz liczba naturalna .
Dane
wyjściowe: pokolorowanie wierzchołków grafu za pomoca̧ kolorów
lub informacja, że takiego pokolorowania nie ma.
dla każdego
podstaw
(
oznacza, że nie ma jeszcze
koloru).
włóż pierwszy wierzchołek na STOS,
>?((?(@ powtarzaj aż do skutku:
4 01 4 0 4 0 4 jeżeli jest wierzchołkiem na wierzchu STOSU, to próbujemy przypisać mu
kolor, wiȩkszy od bieża̧cego koloru
, który nie koliduje z kolorami wierzchołków znajduja̧cych siȩ na STOSIE. Jeżeli to siȩ uda, to wkładamy kolejny wierzcho
łek na stos. Jeżeli siȩ nie uda, to zdejmujemy ze stosu i podstawiamy
.
4 : 24
Rozdział 1. Grafy (nieskierowane)
W tym algorytmie próbujemy kolejnym wierzchołkom przypisać pierwszy z rzȩdu
kolor i pokolorowane wierzchołki umieszczamy na stosie. Jak zabrniemy w ślepa̧ uliczkȩ,
to cofamy siȩ do poprzedniego wierzchołka na stosie i próbujemy nastȩpnego koloru.
Przykład 1.39 Zastosujmy powyżwszy
algorytm do grafu z rysunku 1.12, aby znaleźć
- kolorowanie trzema kolorami
. Najpierw każdy wierzchołek dostaje kolor , co
oznacza, że nie jest jeszcze pokolorowany.
Rysunek 1.12: Przykład grafu
2
5
*
2 34/ *
3
4
/
2
Zaczynamy od wierzchołka . W pierwszych piȩciu krokach algorytm pokoloruje wierzchołki , , , i w nastȩpuja̧cy sposób:
u
c(u)
a
1
b
2
c
1
d
2
e
3
f
0
2 3 4 )/ * 5 (
Teraz algorytm nie może pokolorować wierzchołka 5 , bo jest on poła̧czony z 2 , / , * , które
sa̧ pokolorowane kolorami 1, 2, 3. Dlatego 5 jest zdjȩte ze stosu:
2 3 4 />* (
Teraz zdejmujemy
. wierzchołek * , bo nie można mu przypisać wyższego koloru, i podstawiamy 4 * 234/ (
, a nastȩpnie kolorujemy 4 * i wkładamy 5 na
Teraz zmieniamy kolor / na 4 /
a na stosie mamy wierzchołki
stos.
u
c(u)
a
1
b
2
c
1
d
3
e
2
f
0
2 3 4 )/ * 5 (
W tym momencie pokolorowanie 5 nie jest możliwe, wiȩc zdejmujemy go ze stosu
2 3 4 />* (
1.11. Kolorowanie grafów
25
*
234/ (
Wierzchołek / ma w tym momencie najwyższy kolor 4 /
Wierzchołek też nie może być pokolorowany wyższym kolorem, wiȩc też go zdejmujemy.
, wi˛ec zmiana koloru nie jest
możliwa i zdejmujemy go ze stosu. Mamy teraz nastȩpuja̧ce kolorowanie
u
c(u)
a
1
i stos
b
2
d
0
e
0
f
0
234(
4 4 4 4 * 4 5 c
1
Teraz
zmieniamy
kolor na
, a nastȩpnie już bez nawrotów kolorujemy
,
,
. Ostateczne kolorowanie wygla̧da tak:
u
c(u)
a
1
b
2
c
3
,
d
1
e
2
4 / f
3
-
Jeżeli zastosujemy powyższy algorytm
do pokolorowania grafu pełnego
kolorami, to wypróbuje on wszystkie kolorowań dla pierwszych wierzchołków.
Pesymistyczny czas działania algorytmu jest wiȩc
.
Problem kolorowania grafów jest trywialny, jeżeli mamy tylko jeden kolor
.
Jednym kolorem można pokolorować tylko grafy bez krawȩdzi.
Proste jest też kolorowanie grafów dwoma kolorami. Grafy, które można pokolorowa ć
dwoma kolorami, to grafy dwudzielne. Grafu nie można pokolorować dwoma kolorami,
jeżeli zawiera cykl nieparzystej długości. Poniżej pokażemy, że i na odwrót: jeżeli graf
nie ma cyklu nieparzystej długości, to można go pokolorować dwoma kolorami.
Poniżej przedstawiamy algorytm kolorowania grafów dwoma kolorami. Dla prostoty
zakładamy, że kolorowane grafy sa̧ spójne. Algorytm można łatwo przerobi ć tak, aby
kolorował wszystkie grafy.
= . .
Algorytm kolorowania grafu dwoma kolorami
Dane wejściowe: spójny graf
1
Dane wyjściowe:
pokolorowanie wierzchołków grafu za pomoca̧ dwóch kolorów
- lub informacja, że takiego pokolorowania nie ma.
weź pierwszy wierzchołek , pokoloruj go pierwszym kolorem
4 -
4
.
powtarzaj aż do skutku: Weź wszystkie wierzchołki, które sa̧ poła̧czone krawȩdzia̧
z jakimś wierzchołkiem pokolorowanym w poprzedniej iteracji i nie maja̧ jeszcze
koloru..
Jeżeli wśród nich żadne dwa nie sa̧ poła̧czone krawȩdzia̧, to pokoloruj je
jednym kolorem (innym niż wierzchołki kolorowane w poprzedniej iteracji).
Jeżeli wśród nich sa̧ dwa poła̧czone krawȩdzia̧, to pokolorowanie dwoma
kolorami nie jest możliwe.
26
Rozdział 1. Grafy (nieskierowane)
(
Kolorowanie otrzymywane
w tym algorytmie
jest prawidłowe. Niech
oznacza
0
(
wierzchołki kolorowane
w
-tej
iteracji,
.
Wierzchołki
z
sa̧
kolorowane
na
0
pierwszy kolor, jeżeli jest parzyste,
i
na
drugi
kolor,
jeżeli
jest
nieparzyste.
Zauważmy,
(
że dowolny wierzchołek
może być poła̧czony krawȩdzia̧ tylko z wierzchołka(
(
(
mi ze zbiorów
i
.
zawiera wszystkie wierzchołki,
które sa̧ poła̧czone z
(
(
i
nie
miały
koloru
po
pokolorowaniu
,
tak
wiȩc
żaden ze zbiorów
wierzchołkami
z
+ 3 0 (
z
nie zawiera wierzchołków poła̧czonych
z
.
%
(
że jeżeli dwa % wierzchołki
i % należa do + *,% to
istnieja̧
drogi *% (
Zauważmy,
(
'%
+
+
oraz
takie,
że
.
Niech
% +
, bȩdzie ostatnim wspólnym wierzchołkiem na obu drogach. Ponieważ zbiory sa̧
rozła̧czne,
to wspólne wierzchołki musza̧ mieć te same indeksy. Droga
% *%
jest droga̧ z parzysta̧ liczba̧ krawȩdzi. Dlatego, jeżeli i sa̧ poła̧czone krawȩdzia̧,
to w grafie mamy cykl nieparzystej długości i pokolorowanie dwoma kolorami nie jest
możliwe.
Z powyższych rozważań wynika
7
7,?((?(?. =
7
7
7 ?(?((? 1?(?((?
-(?(?(? Lemat 1.40 Graf jest dwudzielny (może być pokolorowany dwoma kolorami) wtedy i tylko wtedy, gdy nie zawiera cykli nieparzystej długości.
Wniosek 1.41 Każde drzewo można pokolorować dwoma kolorami.
Nie jest znany algorytm koloruja̧cy grafy trzema kolorami (lub dowolna̧ wiȩksza̧
liczba̧ kolorów) działaja̧cy w czasie wielomianowym.
Ponieważ nie sa̧ znane szybkie algorytmy kolorowania grafów stosuje siȩ heurystyki,
czyli algorytmy niedokładne. Na przykład nastȩpuja̧ca heurystyka
Heurystyka kolorowania grafu
Posortuj wierzchołki grafu według ich stopni.
Dla każdego wierzchołka po kolei przypisz mu najniższy możliwy kolor.
W wielu przypadkach heurystyka ta da optymalne rozwia̧zanie, na przykład dla grafu
z rysunku 1.12.
1.12 Hiperkostka
7
Hiperkostka wymiaru 1 jest przedstawiona na rysunku 1.13a.
Składa siȩ ona z dwóch
wierzchołków 0 i 1 poła̧czonych krawȩdzia̧. Hiperkostkȩ wymiaru 2 (rysunek 1.13b)
budujemy z dwóch kostek . W pierwszej kostce numerujemy wierzchołki przez 00 i 01
(dopisujemy 0 na pocza̧tek nazwy każdego wierzchołka). W drugiej kostce numerujemy
wierzchołki przez 10 i 11 (dopisujemy 1 na pocza̧tek). Nastȩpnie ła̧czymy krawȩdziami
odpowiadaja̧ce sobie wierzchołki z obu kopii 00 z 10 i 01 z 11.
Podobnie budujemy hiperkostkȩ wymiaru z dwóch kostek . W pierwszej
kostce numerujemy wierzchołki dopisuja̧c 0 na pocza̧tku nazwy każdego wierzchołka.
W drugiej kostce numerujemy wierzchołki dopisuja̧c 1 na pocza̧tek. Nastȩpnie ła̧czymy
7
7
1.13. Rozgłaszanie wiadomości
Rysunek 1.13: a) Hiperkostka 7 , b) Hiperkostka
1
01
11
0
00
10
a)
27
b)
# A 7
. = # 7
krawȩdziami odpowiadaja̧ce- sobie wierzchołki z obu
kopii,
czyli wierzchołek jest
poła̧czony z wierzchołkiem
.
Rysunek
1.14 przedstawia
, dla każdego hiperkostkȩ .
W rezultacie hiperkostka to graf , gdzie
zawiera wszystkie
cia̧gi bitów długości , a dwa wierzchołki ,
sa̧ poła̧czone krawȩdzia̧ wtedy i tylko
wtedy, gdy różnia̧ siȩ dokładnie jednym
bitem.
Jak łatwo widać w kostkach i sa̧ cykle Hamiltona (w jest droga Hamiltona).
Ogólniej mamy
Lemat 1.42
Każda hiperkostka zawiera
drogȩ Hamiltona. zaczynaja̧ca̧ siȩ w wierz- chołku i kończa̧ca̧ w wierzchołku
.
7
77
7 7
#
-
Dowód przez indukcjȩ
ze wzglȩdu na wymiar kostki.
zawiera
drogȩ
Hamiltona
- Załóżmy, że zawiera drogȩ
Hamiltona
z
do
.
składa
siȩ z dwóch
. W pierszej hiperkostce (tej
z
hiperkostek . Droga w zaczyna siȩ w punkcie
- - - 0 na pocza̧tku każdego wierzchołka) przechodzi do
, potem krawȩdzia̧ do
i w - drugiej
hiperkostce (tej z 1 na pocza̧tku każdego wierzchołka) w odwrotnym kierunku
do
.
Cykl Hamiltona w tworzy tak zwany kod Graya. Jest to cia̧g wszyskich elementowych cia̧gów bitów, każdy wystȩpuje raz, każde dwa kolejne różnia̧ siȩ jednym bitem
oraz ostatni ciag
˛ różni si˛e jednym bitem od pierwszego.
7
1.13 Rozgłaszanie wiadomości
.
Graf
może przedstawiać sieć poła̧czeń. Wierzchołki sa̧ agentami, a krawȩdzie
to ła̧cza, którymi agenci moga̧ siȩ komunikować. Wyobraźmy sobie, że jeden agent posiada jaka̧ś wiadomość, która̧ chce przekazać wszystkim innym agentom w sieci. Reguły sa̧
nastȩpuja̧ce. Komunikacja odbywa siȩ synchronicznie w taktach. W każdym takcie każdy
agent może przekazać wiadomość jednemu swojemu sa̧siadowi.
Powyższy problem nazywa siȩ problemem rozgłaszania. Poniżej
pokażemy, że można
go bardzo efektywnie rozwia̧zać, jeżeli graf jest hiperkostka̧ . Bȩdziemy traktować
cia̧g bitów jako przedstawienie dwójkowe liczby naturalnej.
28
Rozdział 1. Grafy (nieskierowane)
Rysunek 1.14: Hiperkostka -
-)
- -
-)- -
-
-)-
-
Najpierw prześledźmy działanie
tego protokułu na hiperkostce (rysunek 1.14).
Załóżmy, że wierzchołek jest
żródłem
wiadomości.
W
pierwszym
takcie przekazuje on ja̧ do wierzchołka
. Zauważmy, że po pierwszym takcie wiadomość jest
znana wierzchołkom o numerach mniejszych
od 2
i, że te wierzchołki tworza̧ hiperkostkȩ
wymiaru
1.
W
drugim
takcie
wierzchołek
przekaże wiadomość do wierzchoł
- -)ka
, a wierzchołek
do . Po drugim takcie wiadomość znaja̧
wierzchołki
o numerach mniejszych od 4 i tworza̧- one
hiperkostkȩ
wymiaru
2. W trzecim
- - - takcie-)- przekazuje
wiadomość
do
,
do
,
do
- - -),a
do
. Tak wiȩc po trzech taktach wszystkie wierzchołki w znaja̧ wiadomość.
Protokół rozsyłania wiadomości w hiperkostce
Na pocza̧tku wiadomość ma wierzchołek
.
0
Powtarzaj dla
(
w 0 -tym
( takcie każdy wierzchołek przekazuje wiadomość do wierzchołka
.
"
>?((?(@
7
7
0
(
Aby pokazać poprawność tego protokołu, pokażemy przez indukcje, że po -tym
takcie wiadomość jest znana wszystkim wierzchołkom o numerach mniejszych od .
pierwszym
Przed
taktem wiadomość jest znana wierzchołkom
o numerach mniejszych
0
od
, czyli wierzchołkowi 0. Załóżmy, że przed -tym taktem wiadomość jest znana
1.14. Zbieranie informacji
7
# A 7
29
7
(
( (
wszystkim wierzchołkom
o
numerach
mniejszych
od
. Sa̧ to dokładnie wierzchołki
0
( pustym
(cia̧giem). W
postaci
,
gdzie
(jeżeli
to
0
jest
-tym
takcie
każdy
taki
wierzchołek
przekaże
wiadomość
do
, czyli po
0
0
( na
-tym takcie wiadomość bȩda̧ znały wszystkie wierzchołki, które maja̧
pierwszych
bitach zera, czyli wszystkie wierzchołki o numerach mniejszych od .
Protokół ten (po małych przeróbkach) można także stosować do grafu pełnego lub do
innego grafu, który zawiera hiperkostkȩ.
7
1.14 Zbieranie informacji
Hiperkostka jest także wygodna̧ struktura̧ do zbierania informacji, gdy chcemy do jednego wierzchołka zebrać informacje od wszystkich wierzchołków. Informacje te należy
przesyła̧ć w odwrotnym kierunku niż w protkóle rozsyłania. Zakładamy, że przesyłane
informacje sa̧ ła̧czone w pakiety i wierzchołek może przesłać w jednym takcie cały pakiet
zawieraja̧cy kilka informacji.
Protokół zbierania wiadomości w hiperkostce Powtarzaj dla
0
(?(?(?
-
7
w 0 -tym takcie każdy wierzchołek postaci
(
przesyła swój pakiet do wierzchołka
,
(
7
-
, gdzie
A &-
(
1.14).
Przykład 1.43 Prześledźmy działanie
tego protokułu na hiperkostce (rysunek
- W
pierwszym
takcie
wierzchołek
przekazuje
swoj
a
˛
wiadomość
do
,
wierzchołek
- - - - - -) - do
, wierzchołek
do
, a wierzchołek
do
.
- W drugim takcie wierzchołek przekazuje zebrane
wiadomości
(swoja˛ i te, kt.ore
-) otrzymał w poprzednim takcie) do
, a wierzchołek
do
.
W trzecim
takcie wierzchołek
przekazuje zebrane wiadomości do
. a wierz - chołek
do
.
1.15 Plotkowanie
Plotkowanie polega na tym, że na pocza̧tku każdy wierzchołek ma jaka̧ś wiadomość i
chce ja̧ rozesłać do wszystkich innych wierzchołków w grafie.
Znaja̧c protokoły do zbierania i rozsyłania wiadomości możemy zaprojektować protokół plotkowania, który najpierw zbiera wszystkie informacje do jednego wȩzła, a nastȩpnie
rozsyła je do wszystkich wierzchołków.
1.16 Zadania
1. Ile kraw˛edzi ma graf pełny ?
2. Ile maksymalnie kraw˛edzi może mieć graf z wierzchołkami?
30
Rozdział 1. Grafy (nieskierowane)
3. Ile jest grafów ze zbiorem wierzchołków
>?(?((@ ?
-
4. Ile kraw˛edzi ma dwudzielny graf pełny $ ?
2 3 4 . Które z nich sa̧
5. Udowodnij, że izomorfizm grafów jest relacja̧ równoważności.
6. Narysuj wszystkie grafy ze zbiorem wierzchołków
izomorficzne?
2 34/ 7. Narysuj możliwie jak najwiȩcej nieizomorficznych grafów z czterema wierzchołkami
.
8. Narysuj dwa nieizomorficzne grafy z ta̧ sama̧ (możliwie jak najmniejsza̧) liczba̧
wierzchołków.
9. Narysuj dwa nieizomorficzne drzewa z ta̧ sama̧ (możliwie jak najmniejsza̧) liczba̧
wierzchołków.
10. Narysuj dwa nieizomorficzne grafy z ta̧ sama̧ (możliwie jak najmniejsza̧) liczba̧
wierzchołków i ta̧ sama̧ liczba̧ krawȩdzi.
11. Narysuj dwa nieizomorficzne grafy, które maja̧ ta̧ sama̧ liczba̧ wierzchołków stopnia , dla każdego .
12. Zastosuj algorytm przeszukiwania grafu w gła̧b (wszerz) do grafów z rysunków 1.1
i 1.10.
13. Zkonstruuj drzewa spinaja̧ce dla grafów z rysunków 1.1 i 1.10.
14. Korzystaja̧c z drzew spinaja̧cych z poprzedniego zadania, znajdź zbiór cykli fundamentalnych dla grafów.
15. Zmodyfikuj algorytm przeszukiwania grafu wszerz tak, aby wyznaczał on także
drzewo spinaja̧ce (złożone z tych krawȩdzi, którymi przeszedł algorytm). Zastosuj
ten algorytm do grafów z rysunków 1.1, 1.7 i 1.10.
16. Sprawdź, które grafy przedstawione na rysunkach w tym rozdziale posiadaja̧ cykl
(lub drogȩ) Eulera.
17. Sprawdź, które grafy przedstawione na rysunkach w tym rozdziale posiadaja̧ cykl
lub drogȩ Hamiltona.
18. Zastosuj algorytm kolorowania z nawrotami do grafu z rysunku 1.7.
19. Znajdź graf, dla którego heurystyka przedstawiona w podrozdziale o kolorowaniu
grafów nie znajduje optymalnego kolorowania.
20. Narysuj hiperkostkȩ . Wskaż w niej cykl Hamiltona. Prześledź na niej protokół
rozsyłania wiadomości.
1.17. Problemy
1.17 Problemy
. 31
Oto algorytm konstrukcji minimalnego drzewa spinaja̧cego
dla grafu
: (1) zaczynamy od zbioru wszystkich krawȩdzi
grafu , (2) sortujemy
krawȩdzie według
długości, od najdłuższej do najkrótszej (3) dla każdej krawȩdzi
usuwamy ja̧ z
, jeżeli jej usuniȩcie nie rozspójnia grafu .
Udowodnij poprawność tego algorytmu.
Zastosuj powyższy algorytm do grafu z rysunku 1.9a.
%
*
5 "
bȩdzie dowolnym grafem z wagami krawȩdzi , a
Niech
dowolnym
minimalnym
drzewem spinaja̧cym. Pokaż, że dla dowolnego wierzchołka
do
należa̧ te krawȩdzie wychodza̧cych z , które maja najkrótsze
wagi, to znaczy,
jeżeli
i
sa̧
dwiema
krawȩdziami
przyległymi
do
takimi,
że
oraz , to
%
/ %
.
* * 5 5 * "

Podobne dokumenty