32
 V. gimnazija Zagr eb, Kl ai´ ceva 1 Algoritmi u teoriji grafova U ˇ cenik: Fil ip Ni k ˇ sc Mentor: prof . Peta r Mladini´c Zagreb, svibanj 2004.

Algoritmi u Teoriji Grafova

Embed Size (px)

Citation preview

V. gimnazija Zagreb, Klaieva 1 c

Algoritmi u teoriji grafova

Uenik: Filip Niki c sc Mentor: prof. Petar Mladini c

Zagreb, svibanj 2004.

V. gimnazija Zagreb, Klaieva 1 c

Maturalni rad

Algoritmi u teoriji grafova

Uenik: Filip Niki, 4.f c sc

Zagreb, svibanj 2004.

Sadraj z1. Uvod 1.1. Povijesni pregled . . . . . . . . . . . . . . . . . . . . . . . . . 4 5

2. Teorija grafova 7 2.1. Sto je graf? . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 2.2. Setnje, putovi i povezanost . . . . . . . . . . . . . . . . . . . . 10 2.3. Reprezentacija grafova . . . . . . . . . . . . . . . . . . . . . . 12 2.4. Posebni grafovi . . . . . . . . . . . . . . . . . . . . . . . . . . 15 3. Osnovni obilasci grafova 17

3.1. Pretraivanje u irinu . . . . . . . . . . . . . . . . . . . . . . . 17 z s 3.2. Pretraivanje u dubinu . . . . . . . . . . . . . . . . . . . . . . 19 z 4. Najmanje razapinjue stablo c 22

4.1. Primov algoritam . . . . . . . . . . . . . . . . . . . . . . . . . 23 4.2. Kruskalov algoritam . . . . . . . . . . . . . . . . . . . . . . . 25 5. Najkrai put c 27

5.1. Dijkstrin algoritam . . . . . . . . . . . . . . . . . . . . . . . . 27 6. Zakljuak c 30

3

1. UvodPuno sam vremena proveo razmiljajui o svojoj maturalnoj radnji. Jo s c s mnogo prije etvrtog razreda znao sam da e tema biti matematika, jer je c c c to predmet koji mi se prirodno nametnuo tokom kolovanja. Odluivanje se s c svelo samo na izbor podruja matematike o kojem u pisati. c c Neko vrijeme sam ozbiljno razmiljao da piem o matricama. To zanims s ljivo podruje pobudilo je u meni velik interes pa sam ak u nekoliko navrata c c drao predavanja o matricama u razredu, a napisao sam o njima i lanak za z c na matematiko-informatiki asopis Playmath. s c c c U zadnje vrijeme moju je panju snano privukla i teorija skupova, za koju z z se moe rei da zadire u same temelje matematike i da je moderna matematika z c bez nje nezamisliva. Neki tvrde da se itava dananja matematika moe c s z izvesti iz teorije skupova. No, i jedno i drugo su podruja o kojima u mojoj glavi postoji jo mnogo c s nepoznanica pa sam se odluio drati neega to neto dulje prouavam i s c z c s s c ime sa sigurnou mogu tvrditi da sam bolje upoznat. c sc S teorijom grafova susreo sam se i prije nego sam doao u srednju kolu. s s Kako sam u svojim osnovnokolskim danima vrlo uspjeno sudjelovao na s s raznim informatikim natjecanjima, bio je red da se upoznam s tim za inforc matiku neophodnim podrujem matematike. Vrlo velik dio onoga to danas c s znam o grafovima dugujem predavanjima dr. Igora Urbihe u sklopu Zimske kole informatike u Osijeku poetkom 2001. godine. Biljeke s tih predavanja s c s su mi od neprocjenjive vrijednosti. Ostatak sam pokupio s raznih Internet stranica i iz raznih knjiga.

4

Poglavlje 1. Uvod

5

1.1.

Povijesni pregled

Temelje teoriji grafova udario je dobro poznati vicarski matematiar Leons c hard Euler (1707.1783.) koji je 1736. godine rijeio problem knigsberkih s o s mostova. Naime, stari pruski grad Knigsberg, dananji Kalinjingrad u Ruo s siji, smjeten je na obalama rijeke Pregel. Dio grada nalazi se na dvije ade s (rjena otoka), koje su povezane s kopnom i medusobno sa sedam mostova c (vidi sliku 1.1.).

A B DSlika 1.1. Knigsberki otoci. o s

C

Gradani Knigsberga voljeli su etati po mostovima, no ljutilo ih je to o s s nitko nije mogao pronai nain da proeta gradom tako da svih sedam mosc c s c c tova prijede samo jednom i zatim se vrati kui. Za pomo su se obratili Euleru koji je u to vrijeme djelovao u Petrogradu. Euler je vrlo brzo pokazao da je takva etnja nemogua. s c Pretpostavimo da je takva etnja mogua. Tada ona zavrava u kompos c s nentama kopna A, B, C ili D, eventualno tamo gdje je zapoela. Primijec timo da svaka komponenta kopna u kojoj etnja nije zapoela i nije zavrila s c s mora biti spojena s parnim brojem mostova, jer za svaki most preko kojeg se dolazi na tu komponentu mora postojati i most preko kojeg se odlazi s te komponente. Zato svaka komponenta koja je spojena s neparnim brojem mostova mora biti ili poetak ili kraj etnje. No u sluaju Knigsberga svaka c s c o komponenta A, B, C i D ima neparan broj mostova s kojima je povezana, a kako najvie dvije komponente mogu biti poetak, odnosno kraj etnje, s c s zakljuujemo da takva etnja nije mogua. c s c

Poglavlje 1. Uvod

6

Ako komponente A, B, C i D prikaemo kao toke ili vrhove, a mostove z c koji ih spajaju kao bridove ili spojnice, dobivamo pojednostavljenu shemu vrhova i njihovih spojnica, tj. graf.

A

B

C

DSlika 1.2. Graf.

Problem etanja po knigsberkim mostovima ekvivalentan je problemu s o s obilaska ovog grafa tako da krenemo iz jednog vrha i sve bridove prijedemo tono jedanput. c

2. Teorija grafovaPostoji nebrojeno mnogo skupova s konanim brojem elemenata medu kojima c postoje neke relacije. Primjerice, skup bi se mogao sastojati od nekoliko ljudi, ivotinja, drava, kompanija, sportskih timova ili gradova; relacije izmedu z z dva elementa A iz B takvog skupa bi mogle biti takve da osoba A pozna osobu B, ivotinja A se hrani ivotinjom B, drava A granii s dravom B, z z z c z kompanija A suraduje s kompanijom B, sportski tim A je igrao protiv tima B, grad A ima direktnu eljezniku (ili cestovnu) liniju do grada B. z c Takve i mnoge druge konane skupove i strukture prouava matematika c c c disciplina koja se zove kombinatorna i diskretna matematika ili krae komc binatorika (vie o tome u [3]). Vrlo vaan dio kombinatorike su grafovi, kao s z jedna od osnovnih matematikih struktura koja omoguuje modeliranje rec c lacija izmedu elemenata konanih skupova. c

2.1.

Sto je graf ?

Denicija 2.1. Graf G je uredeni par G = (V, E), gdje je V neprazan skup vrhova, a E je skup bridova. Svaki brid e E spaja dva vrha u, v V koji se zovu krajevi od e. Brid iji se krajevi podudaraju zove se petlja, a ako dva c ili vie bridova povezuju isti par vrhova, zovu se viestruki bridovi. Ako graf s s sadri viestruke bridove, zove se multigraf, a ako nema ni petlja ni viestrukih z s s bridova, zove se jednostavan graf. Broj vrhova u grafu oznaavamo s v(G), c a broj bridova s e(G).

7

Poglavlje 2. Teorija grafova

8

a e1 b e2 e3 c dSlika 2.1. Neusmjereni graf.

e5 e4 f e

Primjer 2.1. Graf sa slike 2.1. denira se na slijedei nain: c c G = (V, E) V = {a, b, c, d, e, f } E = {e1 , e2 , e3 , e4 , e5 } e1 = {a, b} e2 = {b, c} e3 = {d, e} e4 = {b, f } e5 = {f, a} U prikazanom grafu bridovi su neusmjereni, tj. po svakom bridu se moe z ii u oba smjera. Drugim rijeima, u primjeru 2.1. se iz vrha a moglo doi c c c u vrh b isto kao i iz vrha b u vrh a. No ponekad su grafovi usmjereni pa bridovi imaju svoj smjer. Na slikama se smjer oznaava strelicama. c Primjer 2.2. (Vidi sliku 2.2.) Kod zapisivanja koji su vrhovi pridrueni z kojem bridu vie ne koristimo vitiaste, nego okrugle zagrade jer kod usmjes c renih grafova postaje bitno koji vrh je prvi naveden. e1 = (a, b) e2 = (b, c) e3 = (d, e)

Poglavlje 2. Teorija grafova

9

a e1 b e2 e3 c dSlika 2.2. Usmjereni graf.

e5 e4 f e

e4 = (b, f ) e5 = (f, a) Denicija 2.2. Stupanj vrha je broj bridova s kojima je vrh spojen, tj. koji su incidentni vrhu. Kod usmjerenih grafova izlazni stupanj je broj bridova koji izlaze iz vrha, a ulazni stupanj je broj bridova koji ulaze u vrh. (Vidi slike 2.3. i 2.4.)

b e1 a e2 e6 cSlika 2.3. Stupanj vrha b je 3.

e3 e7 e4 e5

d

Vrlo esto se javlja potreba da svakom bridu e grafa G pridruimo realan c z broj w(e) koji zovemo teina brida e. Takav graf zovemo teinski graf. Na z z

Poglavlje 2. Teorija grafova

10

b e1 a e3 cSlika 2.4. Stupanj vrha a je 3, izlazni stupanj je 2, a ulazni stupanj je 1.

e5 d e4

e2

primjer, ako vrhovi grafa predstavljaju gradove neke drave, a bridovi ceste z koje ih povezuju, teina brida moe predstavljati duljinu ceste, ili cestarinu z z koju voza mora platiti da se vozi tom cestom. c

2.2.

Setnje, putovi i povezanost

Denicija 2.3. Setnja u grafu G je naizmjenian niz vrhova i bridova c (v0 e1 v1 e2 . . . vk1 ek vk ), pri emu je c v0 , v1 , v2 , . . . , vk V, e1 , e2 , e3 , . . . , ek E. Pritom je za usmjereni graf ei = (vi1 , vi ), a za neusmjereni graf ei = {vi1 , vi }, 1 i k. U jednostavnom grafu etnja je jednoznano odredena s c samo nizom svojih vrhova (v0 v1 . . . vk ). Kaemo da je v0 poetak, a vk kraj z c etnje. s Tako primjerice na slici 2.3. imamo slijedeu etnju: (ae1 be4 de6 ce6 d). c s Staza je etnja bez ponovljenih bridova. Na slici 2.3. primjer staze je s (ae1 be4 de3 b).

Poglavlje 2. Teorija grafova

11

Put je etnja u kojoj su svi vrhovi razliiti. Na slici 2.3. moemo vidjeti s c z put (ae2 ce5 de3 b). Ako su poetak i kraj etnje isti vrhovi, govorimo o zatvorenoj etnji (na c s s slici 2.3. to je npr. (ae1 be4 de4 be1 a)). Ciklus je zatvorena staza. (Npr. (ce6 de3 be4 de5 c).) Ciklus je jednostavan ako u njemu nema ponovljenih vrhova osim poetka i kraja. (ae1 be4 de5 ce2 a) c

Eulerovi grafoviVjerojatno svi znaju za razne probleme crtanja grafova bez podizanja olovke s papira. Ti problemi, zajedno s mostovima Knigsberga spadaju u najstarije o probleme teorije grafova, a karakterizira ih to to se u biti radi o traenju s z zatvorene staze u grafu koja sadri svaki brid ili, u lakim sluajevima, o z s c traenju staze koja ne mora biti zatvorena, a sadri svaki brid. z z Staza u grafu koja sadri svaki brid zove se Eulerova staza, a ako je takva z staza jo i zatvorena, zove se Eulerova tura. Ako graf ima Eulerovu turu, s zove se Eulerov graf. Teorem 2.1. Neusmjereni graf G je Eulerov ako i samo ako mu je svaki vrh parnog stupnja. Karakterizaciju Eulerova grafa znao je ve i sam Euler 1736. godine, no c dokaz ovog teorema naden je tek 1873. Citatelju je ostavljeno da ga sam pokua izvesti, ili neka ga proita u [3], str. 277.-278. s c Iz teorema 2.1. dobiva se i slijedei korolar: c Posljedica 2.1. Neusmjereni graf G ima Eulerovu stazu ako i samo ako ima najvie dva vrha neparnog stupnja. s Dokaz ovog korolara vrlo je slian dokazu da ne postoji Eulerova staza u c sluaju knigsberkih mostova (str. 5.), a moe se vidjeti u [3], str. 278. c o s z

Poglavlje 2. Teorija grafova

12

Hamiltonovi ciklusiZa razliku od obilaska svih bridova, zanimljivi su i problemi obilaska svih vrhova koje je prouavao irski matematiar William R. Hamilton (1805.c c 1865.). Put u grafu koji sadri svaki njegov vrh zove se Hamiltonov put, a jedz nostavan ciklus koji sadri sve vrhove zove se Hamiltonov ciklus. Ako graf z ima Hamiltonov ciklus, zove se Hamiltonov graf. Problem egzistencije i traenja Hamiltonovog ciklusa u grafu mnogo je z tei od problema Eulerove ture i staze. Inae je poznatiji problem trgovakog z c c putnika: za n gradova, pronadi najkrai put koji prolazi kroz sve gradove. c Do danas jo nisu otkrivni ekasni algoritmi koji rjeavaju te probleme. s s

PovezanostZa graf kaemo da je povezan ako postoji put izmedu svaka dva vrha. Graf z na slici 2.1. nije povezan. Komponenta grafa je najvei podgraf (podskup vrhova i podskup pripadc nih bridova) takav da postoji put izmedu svaka dva vrha komponente. Graf na slici 2.1. ima dvije komponente: {a, b, c, f } i {d, e}. Ako u usmjerenom grafu postoji put od svakog vrha do svakog drugog vrha, kaemo da je takav graf strogo povezan. Strogo povezana komponenta z usmjerenog grafa je vrh u i skup svih vrhova v tako da postoji put iz u u v, i iz v u u.

2.3.

Reprezentacija grafova

Za algoritamsku obradu nekog grafa potreban nam je sustavan i praktian c nain da prikaemo njegove vrhove i bridove. Ovo je posebno bitno kod c z raunala jer graf moramo pohraniti u njegovu ogranienu memoriju. Dobar c c izbor reprezentacije vrlo je vaan jer, ovisno o algoritmu koji primjenjujemo z i ovisno o vrsti grafa koji obradujemo, razliite reprezentacije zauzimaju vrlo c

Poglavlje 2. Teorija grafova

13

razliite koliine memorije, a i vrijeme izvravanja algoritma jako varira za c c s svaku. Kako vrhove obino numeriramo i moemo ih indeksirati pomou njihovog c z c broja, reprezentacije se usmjeravaju na pohranjivanje bridova.

Lista bridovaNain prikazivanja grafa koji je najloginiji i odmah se namee je praenje c c c c liste parova vrhova koji predstavljaju krajeve bridova. Ovaj nain smo ve c c susreli u primjerima 2.1. i 2.2. (str. 7.). Lista bridova se jednostavno implementira u raunalo i koristi malo njec gove memorije, no odredivanje bridova koji su incidentni odredenom vrhu je vremenski skupo, kao i odredivanje jesu li dva vrha susjedna. Kod teinskih grafova za svaki brid pamtimo jo i teinu brida, kod usz s z mjerenih grafova pamtimo uredene umjesto neuredenih parova, a prikaz multigrafova je isto trivijalan.

Matrica susjedstvaSvakom grafu s v(G) vrhova moemo pridruiti kvadratnu matricu M dimenz z zija v(G) v(G) u ijem se i-tom retku i j-tom stupcu nalazi broj bridova c koji spajaju i-ti i j-ti vrh. Takva matrica naziva se matrica susjedstva. Graf sa slike 2.3. ima slijedeu matricu susjedstva: c a a b c d 0 1 1 1 b c d 1 2 2 0

1 1 0 0 0 0 2 2

0 1 1 1

1 0 0 2 M = 1 0 0 2 1 2 2 0

Ovaj nain reprezentacije grafa je isto jednostavan za implementaciju u c raunalo, ali zauzima mnogo vie memorije od liste bridova. Vremenski je c s skupo otkriti je li odredeni brid incidentan odredenom vrhu, no provjera jesu li dva vrha susjedna obavlja se u jednom koraku.

Poglavlje 2. Teorija grafova

14

Kod jednostavnih teinskih grafova na mjesto (i, j) u matrici dolazi teina z z brida, a za teinske multigrafove ovo nije lako proiriti. z s

Matrica incidencijeGraf G je mogue prikazati i matricom incidencije, v(G) e(G) matricom u c ijem se i-tom retku i j-tom stupcu nalazi broj (0, 1 ili 2) koliko su puta vrh c vi i brid ej incidentni. Kako je ova matrica u pravilu mnogo vea od matrice c susjedstva, rijetko se koristi.

Liste susjedstvaKod grafova s relativno malo bridova (u usporedbi s brojem vrhova) u matrici susjedstva se pojavljuje mnogo nula, pa u tom sluaju ona i nije najekasniji c nain pohrane grafa u raunalo. Kod takvih grafova koriste se liste susjedc c stava vektori od v(G) elemenata koji predstavljaju vrhove, gdje je i-tom elementu pridruena lista susjednih vrhova od vrha vi . z Ovaj nain je tei za implementaciju od ostalih, no zauzima otprilike c z jednako memorije kao lista bridova. Traenje vrhova susjednih odredenom z vrhu je vrlo brzo, no provjera jesu li dva vrha susjedna neto je sporija. s Proirenje za spremanje teinskih grafova je jednostavno (za svaki vrh u s z listama pamtimo dodatan broj teinu), multigrafovi se mogu prikazati bez z proirenja, a usmjerene grafove je isto jednostavno prikazati. s

Ostale reprezentacijeZa neke specine sluajeve sam graf uope nije potrebno pohraniti, jer je c c c lako izraunati susjedne vrhove, provjeriti susjedstvo i utvrditi sve bridove c bez stvarnog pohranjivanja informacija. Primjerice, imamo slijedei problem: Za zadanu ahovsku plou veliine c s c c n n, pronadi najmanji broj poteza da skaka s gornjeg-lijevog polja dode c na polje (i, j). Ovdje imamo slijedei graf: vrhovi su polja ploe, a ako se c c s jednog vrha moe skoiti na drugi, izmedu njih postoji brid. Umjesto z c

Poglavlje 2. Teorija grafova

15

da koristimo matricu susjedstva koja bi za klasinu 8 8 plou bila veliine c c c 64 64, mi vrlo lako za zadanu poziciju na ploi moemo izraunati na koja c z c sve polja skaka moe skoiti i to moemo iskoristiti u rjeavanju problema. c z c z s

2.4.

Posebni grafovi

Neusmjereni graf koji ne sadri cikluse i povezan je zove se stablo. z

Slika 2.5. Stablo.

Stabla su najjednostavniji, ali i najvaniji grafovi jer su na neki nain z c svi ostali grafovi sagradeni od njih. Cest je problem traenja razapinjueg z c stabla u grafu stabla koje sadri sve vrhove grafa, ali samo one bridove z koji su dovoljni za postojanje puta izmedu svaka dva vrha u stablu (takvih bridova ima v(G) 1). O razapinjuim stablima bit e rijei u kasnijim poc c c glavljima. Takoder, stabla se koriste u dvije fundamentalne vrste algoritama u raunalnoj znanosti: sortiranju i pretraivanju. c z Ponekad je neki vrh stabla istaknut kao korijen (na slikama je to obino c vrh koji je na vrhu stabla). U tom sluaju moemo denirati relaciju roditeljc z dijete: svaki vrh osim korijena ima jednog roditelja (susjedni vrh koji je blie z korijenu) i bilo koji broj djece (ostali susjedni vrhovi). Neusmjereni graf koji ne sadri cikluse zove se uma. z s Za graf kaemo da je potpun ako postoji brid izmedu svaka dva para z vrhova.

Poglavlje 2. Teorija grafova

16

Slika 2.6. Suma.

Bipartitni graf je graf ije vrhove moemo podijeliti u dva podskupa V1 i c z V2 tako da ne postoji brid izmedu dva vrha u V1 ili izmedu dva vrha u V2 .

V 1

V 2

Slika 2.7. Bipartitni graf.

3. Osnovni obilasci grafovaObilazak ili pretraivanje grafa je sistematian prolazak njegovim bridovima z c kako bi se obili svi njegovi vrhovi. Algoritmi koji obavljaju takav prolazak s otkrivaju mnogo o strukturi grafa. Primjerice, pomou njih moemo saznati c z je li graf povezan i od kojih se komponenti sastoji ako nije, ima li u njemu ciklusa i sl. Zbog toga su algoritmi za pretraivanje temelj veine ostalih z c algoritama u teoriji grafova, tj. moemo rei da su ostali algoritmi nadgradnje z c algoritama za pretraivanje. z Dva najea algoritma za obilazak ili pretraivanje grafa su pretraivanje c sc z z u irinu (engl. Breadth-First Search) i pretraivanje u dubinu (engl. Depths z First Search).

3.1.

Pretraivanje u irinu z s

Za zadani graf G = (V, E), i poetni vrh s, pretraivanje u irinu sistematino c z s c istrauje bridove grafa da bi otkrilo svaki vrh dostupan iz s. Ideja je da z se iz vrha s prvo posjete svi susjedni vrhovi od s, zatim susjedi susjeda itd. sve dok se ne posjete svi vrhovi dostupni iz s. Pritom se rauna udaljenost c (najmanji broj bridova) od s do svih dostupnih vrhova (dakle, ovaj algoritam usput rjeava problem najkraeg puta od s do ostalih vrhova). s c Ime je dobio po tome to se granica izmedu otkrivenih i neotkrivenih s vrhova iri kroz graf, tj. algoritam prvo otkriva vrhove na udaljenosti k od s s, a tek onda one na udaljenosti k + 1. Da bi pratio napredak, ovaj algoritam boji vrhove bijelom, sivom ili crnom

17

Poglavlje 3. Osnovni obilasci grafova

18

bojom. Na poetku su svi vrhovi bijeli. Kad je neki vrh prvi put otkriven, on c postaje siv, a kad sve njemu susjedne bijele vrhove obojimo u sivo, postaje crn. Na taj nain su svi susjedi nekog crnog vrha sivi ili crni, dok sivi vrh c moe imati bijele vrhove medu svojim susjedima. Sivi vrhovi predstavljaju z granicu izmedu otkrivenih i neotkrivenih vrhova. Ovome odgovara struktura podataka red (queue) uz koju veemo dvije z operacije: moemo staviti neto na kraj reda i uzeti neto s poetka reda. z s s c U redu e uvijek biti sivi vrhovi; uzet emo jedan sivi vrh s poetka reda, c c c sve njegove bijele susjede staviti na kraj reda (pritom e oni postati sivi) i c obojiti vrh u crno. Za reprezentaciju grafa koristit emo liste susjedstva lista gdje lista(x) c predstavlja listu susjednih vrhova vrhu x. S d(x) emo oznaiti najmanji c c broj bridova od s do x, a s boja(x) boju vrha x. Algoritam 3.1. Pretraivanje u irinu z s 1. Za svaki vrh u V \ {s} postavi d(u) i boja(u) bijela. 2. d(s) 0. 3. boja(s) siva. 4. Stavi s na kraj reda. 5. Dok je red neprazan radi slijedee: c 5.1. Uzmi u s poetka reda. c 5.2. Za svaki vrh v lista(u), ako je boja(v) = bijela, radi slijedee: c 5.2.1. d(v) d(u) + 1. 5.2.2. boja(v) siva. 5.2.3. Stavi v na kraj reda. 5.3. boja(u) crna. Algoritam radi na slijedei nain: Korak 1. postavlja sve udaljenosti na c c nulu, kao i sve boje na bijelu. Koraci 2.4. postavljaju udaljenost poetnog c vrha na 0, boje ga u sivo (jer je on otkriven na poetku) i stavljaju ga u c red. Petlja pod 5. korakom je glavni dio. Dok god ima sivih vrhova, red je neprazan i sadri vrhove koji su otkriveni, ali njihove liste susjedstva jo z s

Poglavlje 3. Osnovni obilasci grafova

19

nisu pregledane. Algoritam redom uzima sive vrhove s poetka reda (korak c 5.1.), pregledava vrhove u njihovim listama susjedstva (korak 5.2.) i, ako su bijeli, otkriva ih, boji u sivo, postavlja im udaljenost d(v) na d(u)+1 i stavlja ih u red (koraci 5.2.1.5.2.3.). Konano, kad su svi vrhovi u listi susjedstva c pregledani, vrh u postaje crn (5.3.).

s

sSlika 3.1. Pretraivanje u irinu. z s

Ako ovakvim obilaskom kroz graf G = (V, E) konstruiramo stablo (podgraf) T = (V, ET ) tako da za svaki bijeli susjedni vrh v vrha u dodamo brid (u, v) u ET , dobit emo razapinjue stablo grafa G poznato pod nazic c vom breadth-rst search tree. U ovom stablu jasno se vide najkrai putovi c od vrha s do ostalih vrhova; najkrai put u grafu G od vrha s do vrha u c odgovara putu od s do u u razapinjuem stablu T . c

3.2.

Pretraivanje u dubinu z

Drugi algoritam za obilazak grafa je pretraivanje u dubinu. Ovaj algoritam z takoder sistematino pronalazi sve vrhove, ali na neto drukiji nain od c s c c

Poglavlje 3. Osnovni obilasci grafova

20

pretraivanja u irinu. Naime, umjesto da se iri u grafu, on nastoji uvijek z s s ii dublje u graf, tj. za svaki susjedni vrh v vrha u pretraivanje u dubinu c z se rekurzivno poziva i provjerava susjede vrha v prije nego se vrati i provjeri preostale susjede vrha u. Slino kao kod pretraivanja u irinu, i pretraivanje u dubinu boji vrhove c z s z kako bi pratilo napredak. Svaki vrh je na poetku bijel, kad je otkriven c postaje siv, a kad je zavren (tj. kad su mu svi vrhovi na listi susjedstva s otkriveni i provjereni) postaje crn. Opet za reprezentaciju koristimo liste susjedstva, a svakom vrhu v emo c ovim algoritmom pridruiti broj br(v) od 1 do v(G). z Algoritam 3.2. Pretraivanje u dubinu z 1. Za svaki vrh u V postavi br(u) 0 i boja(u) bijela. 2. i 0. 3. Posjeti vrh s. 4. Poni proceduru Posjeti vrh u. c 4.1. boja(u) siva. 4.2. i i + 1. 4.3. br(u) i. 4.4. Za svaki vrh v lista(u), ako je boja(v) = bijela, Posjeti vrh v. 4.5. boja(u) crna. Algoritam radi na slijedei nain: U koracima 1. i 2. svi brojevi br(u) c c se postavljaju na nulu, sve boje se postavljaju na bijelu i inicijalizira se broja i. U koraku 3. poziva se procedura Posjeti vrh u za poetni vrh s. c c Korakom 4. zapoinje glavni dio algoritmarekurzivna procedura Posjeti c vrh u: u koracima 4.1.4.3. boja vrha u postaje siva, broja se uveava c c za 1 i pridruuje se varijabli br(u). Korakom 4.4. za svaki susjedni vrh v z vrha u procedura Posjeti vrh u se rekurzivno poziva. Konano, posljednjim c korakom 4.5. boja vrha u postaje crna, to znai da su svi njegovi susjedni s c vrhovi otkriveni i zavreni. s Slino konstrukciji breadth-rst search stabla kod pretraivanja u irinu, c z s

Poglavlje 3. Osnovni obilasci grafova

21

s

sSlika 3.2. Pretraivanje u dubinu. z

pretraivanjem u dubinu moe se konstruirati razapinjue stablo depth-rst z z c search tree.

4. Najmanje razapinjue stablo cRecimo da imamo slijedei problem: n gradova treba povezati cestama tako c da uvijek postoji put izmedu dva grada, a da trokovi izgradnje cesta budu s minimalni (pritom znamo koliko kota izgradnja ceste izmedu svaka dva s grada). Ovaj problem moe se svesti na openitiji problem traenja najz c z povoljnijeg naina za povezivanje svih vrhova grafa, tj. na problem traenja c z najmanjeg ili minimalnog razapinjueg stabla. c Denicija 4.1. Najmanje razapinjue stablo grafa G = (V, E) je njegov c podgraf T = (V, ET ) koji sadri sve vrhove V i samo one bridove koji su z dovoljni za postojanje puta izmedu svaka dva vrha, a da pritom zbroj teina z tih bridova bude najmanji mogui. Najmanje razapinjue stablo ne mora biti c c jedinstveno. Primijetimo da nema smisla govoriti o najmanjem razapinjuem stablu c u neteinskom grafu budui da su u tom pogledu sva razapinjua stabla z c c jednaka (jer bridovi nemaju teina). z Postoji vie naina da se pronade najmanje razapinjue stablo. U ovom s c c poglavlju pokazat u dva takva naina, a oba se temelje na slijedeem svojc c c stvu: Svojstvo 4.1. Za bilo koju podjelu vrhova grafa u dva skupa, najmanje razapinjue stablo sadri brid najmanje teine koji povezuje neki vrh u prvom c z z skupu s nekim vrhom u drugom skupu. Ovo svojstvo lako se dokazuje kontradikcijom. Neka je s brid najmanje teine koji povezuje dva skupa vrhova. Pretpostavimo da s nije u najmanjem z 22

Poglavlje 4. Najmanje razapinjue stablo c

23

razapinjuem stablu. Promotrimo sada graf koji nastaje kad najmanjem c razapinjuem stablu dodamo brid s: takav graf ima ciklus u kojem postoji jo c s jedan brid koji povezuje dva skupa vrhova. Brisanjem tog brida i dodavanjem s dobivamo manje razapinjue stablo to je u suprotnosti s pretpostavkom c s da s nije dio najmanjeg razapinjueg stabla. c Najmanje razapinjue stablo, dakle, moemo konstruirati tako da krec z nemo od bilo kojeg vrha i uvijek dodajemo vrh koji je najblie ve dodanim z c vrhovima. Drugim rijeima, pronademo brid najmanje teine koji povezuje c z vrhove koji su ve dio stabla i vrhove koji to jo nisu, i dodamo stablu taj brid c s i vrh do kojeg on vodi (u sluaju da postoje dva brida najmanje teine, bilo c z koji e posluiti). Svojstvo 4.1. nam jami da je dodani brid dio najmanjeg c z c razapinjueg stabla. c5 5 5 5 7 2 3 2 1 4 3 3

2

Slika 4.1. Najmanje razapinjue stablo. c

4.1.

Primov algoritam

Za Primov1 algoritam moemo rei da je generalizacija algoritama za obiz c lazak grafa iz prethodnog poglavlja. Naime, kako je pretraivanje u dubinu z rekurzivan algoritam, rekurziju je mogue maknuti koritenjem strukture poc s dataka stog (engl. stack) koja slino kao red ima dvije operacije: moemo c z1

Robert Prim, ameriki matematiar, 1957. je otkrio algoritam za traenje najmanjeg c c z

razapinjueg stabla. c

Poglavlje 4. Najmanje razapinjue stablo c

24

neto staviti na vrh stoga i uzeti neto s vrha stoga (prisjetimo se, kod reda s s smo stavljali na kraj reda, a uzimali s poetka reda). Pretraivanje u irinu i c z s dubinu se, dakle, u sutini razlikuju samo po organizaciji strukture podataka s za pamenje sivih vrhova. c Struktura podataka koja se koristi za Primov algoritam je prioritetni red (engl. priority queue). Podatci su organizirani u prioritetnom redu po nekom prioritetu. Kad dodamo novi podatak, on se ovisno o prioritetu pomie c blie poetku ili blie kraju prioritetnog reda. Prema potrebi, prioritet poz c z datka moemo mijenjati. Kad nam je potreban podatak iz prioritetnog reda, z uzimamo onaj s poetka. Ispada da odredivanjem prikladnih prioriteta, pric oritetni red postaje red, odnosno stog. U Primovom algoritmu kreemo s jednim vrhom s, koji e biti korijen c c najmanjeg razapinjueg stabla. Svi vrhovi koji nisu dio stabla nalaze se u c prioritetnom redu Q poredani po kljuu. Za svaki vrh v, kljuc(v) je najmanja c teina w bilo kojeg brida koji povezuje v s nekim vrhom u stablu; ako z takav brid ne postoji. U svakom koraku algoritam uzima iz prioritetnog reda vrh koji je bridom minimalne teine povezan sa stablom i pridruuje taj z z njegov brid skupu ET , skupu koji e u konanici sadravati bridove najmanjeg c c z razapinjueg stabla T = (V, ET ). (v) je roditelj vrha v u stablu. c Algoritam 4.1. Primov algoritam 1. Q V . 2. ET . 3. Za svaki vrh u Q postavi kljuc(u) . 4. kljuc(s) 0. 5. (s) NISTA. 6. Dok je Q = radi slijedee: c 6.1. u uzmi s poetka Q. c 6.2. Ako je (u) = NISTA, ET ET {{u, (u)}}. 6.3. Za svaki vrh v lista(u), ako je (v Q) (w(u, v) < kljuc(v)) radi slijedee: c 6.3.1. (v) u.

Poglavlje 4. Najmanje razapinjue stablo c 6.3.2. kljuc(v) w(u, v).

25

Na poetku sve vrhove postavljamo u prioritetni red Q i kljueve postavc c ljamo na . Klju poetnog vrha s postavljamo na 0, a (s) na NISTA jer c c je s korijen stabla. Dok god je Q neprazan, u postaje vrh izvan stabla s minimalnom teinom brida kojim je spojen sa stablom te se pridruuje stablu z z (na nain da ga se makne iz Q, a brid kojim je spojen sa stablom se doda u c ET ). Svim njegovim susjedima v Q mijenja se kljuc(v) i roditelj (v) ako je teina brida kojim su spojeni s u manja od dotadanjeg kljuca, tj. ako je z s taj vrh v blie stablu u kojem je sad novi vrh u nego to je bio prije. z s

4.2.

Kruskalov algoritam

Kruskalov2 algoritam radi na bitno drukiji nain od Primovog. Dok smo kod c c Primovog algoritma stalno poveavali jedno stablo dodavajui nove bridove c c i vrhove, kod Kruskalovog algoritma kreemo sa umom u koju u svakom c s koraku dodajemo brid s najmanjom teinom koji ne stvara ciklus u postojeoj z c umi. Na taj nain na kraju zavravamo s najmanjim razapinjuim stablom. s c s c Algoritam 4.2. Kruskalov algoritam 1. Sortiraj bridove ei E (i = 1, 2, . . . , e(G)) uzlazno po w(ei ). 2. ET . 3. i 0. 4. Dok je i < e(G) radi slijedee: c 4.1. i i + 1. 4.2. Ako ET {ei } nema ciklus postavi ET ET {ei }. Na poetku algoritam sortira bridove uzlazno prema njihovoj teini. ET se c z postavlja na prazan skup, a broja i na nulu. Algoritam zatim provjerava svih c e(G) bridova; ako brid ei u dotadanjoj umi ne stvara cikluse, dodajemo ga s s u umu. Suma u konanici postaje najmanje razapinjue stablo T = (V, ET ). s c c2

Joseph Kruskal, ameriki matematiar, 1956. je otkrio algoritam za traenje najc c z

manjeg razapinjueg stabla. c

Poglavlje 4. Najmanje razapinjue stablo c

26

I Kruskalov i Primov algoritam spadaju u skupinu pohlepnih algoritama (engl. greedy algorithm). Naime, u svakom koraku biraju ono to je u tom tres nutku najbolje. Pohlepni algoritmi su esto netoni jer najbolje u odredenom c c trenutku ne mora biti optimalno i na kraju, no kod ova dva algoritma svojstvo 4.1. garantira njihovu tonost. c

5. Najkrai put cProblem koji se uz traenje najmanjeg razapinjueg stabla esto javlja u z c c teoriji grafova je problem traenja najkraeg puta: trai se put u teinskom z c z z grafu koji povezuje dva vrha x i y tako da zbroj teina bridova na tom putu z bude najmanji mogui. Problem je zanimljiv i u neteinskom grafu - trai se c z z put s najmanjim brojem bridova koji povezuje x i y. Na stranici 18. vidjeli smo da se ovakav problem jednostavno rjeava pretraivanjem u irinu. s z s Openito govorei, kako bi najkrai put od x do y mogao proi bilo kojim c c c c bridom, problem se pretvara u traenje najkraeg puta od x do svih ostalih z c vrhova. Uz to, jo nije poznat algoritam koji bi rijeio problem traenja puta s s z od x do y bre od algoritma za traenje puta od x do svih ostalih vrhova. z z Najpoznatiji algoritmi za traenje najkraeg puta su Dijkstrin algoritam i z c Bellman-Fordov algoritam. U ovom poglavlju bit e pokazan Dijkstrin alc goritam, a za Bellman-Fordov algoritam itatelj se upuuje da pogleda [2], c c str. 532.

5.1.

Dijkstrin algoritam

Dijkstrin1 algoritam gotovo je identian Primovom algoritmu po nainu rada. c c On odrava skup S u kojem se nalaze vrhovi v za koje je najkraa udaljenost z c d(v) od poetnog vrha x ve odredena. Algoritam u svakom koraku odabire c c vrh u V \S tako da je udaljenost d(u) minimalna (za spremanje vrhova koji1

Edsger W. Dijkstra (1930.2002.), nizozemski matematiar, otkrio algoritam za c

traenje najkraeg puta u teinskom grafu. z c z

27

Poglavlje 5. Najkrai put c

28

nisu u skupu S koristimo prioritetni red Q organiziran prema kljuu d(v)) te c prema potrebi poboljava udaljenosti svojih susjeda v V \ S. Prethodnik s (v) vrha v predstavlja susjedni vrh vrha v koji se u najkraem putu nalazi c blie poetnom vrhu. Ovo nam pomae kod ispisa puta. z c z Algoritam 5.1. Dijkstrin algoritam 1. Za svaki vrh v V postavi d(v) i (v) NISTA. 2. d(x) 0. 3. S . 4. Q V . 5. Dok je Q = radi slijedee: c 5.1. u uzmi s poetka Q. c 5.2. S S {u}. 5.3. Za svaki vrh v lista(u), ako je (v Q) (d(v) > d(u) + w(u, v)), radi slijedee: c 5.3.1. d(v) d(u) + w(u, v). 5.3.2. (v) u. Algoritam prvo radi ve uobiajenu inicijalizacijupostavlja sve udaljec c nosti na , sve prethodnike na NISTA, udaljenost poetnog vrha x od samog c sebe na 0, S na prazan skup i stavlja sve vrhove u prioritetni red Q (linije 1. 4.). Dok god ima vrhova u prioritetnom redu, algoritam s njegovog poetka c uzima u za koji je d(u) najmanji i prema potrebi modicira njegove susjede koji su jos u Q tako da im smanji udaljenost od poetnog vrha i promijeni c prethodnika (petlja pod korakom 5.). Zbog toga to u svakom koraku uzima vrh s najkraom udaljenosti, Dijs c kstrin algoritam takoder spada u pohlepne algoritme, ali, naravno, stvarno pronalazi najkrai put. (Za dokaz pogledati [2], str. 529.) c Da bismo ispisali pronadeni najkrai put od x do y, posluit emo se c z c informacijama koje smo skupili o prethodnicima svakog vrha na najkraem c putu i slijedeom procedurom: c Algoritam 5.2. Ispis najkraeg puta c

Poglavlje 5. Najkrai put c 1. Poni proceduru Ispis(G, x, y). c 2. Ako je x = y, ispii x s 3. inae radi slijedee: c c 3.1. Ako je (x) = NISTA ispii Ne postoji put od x do y s 3.2. inae Ispis(G, x, (y)), ispii y. c s

29

Procedura rekurzivno prolazi putem od y do x pomou sauvanih pretc c hodnika i na povratku ispisuje svaki vrh na putu od x do y.

6. Zakljuak cAlgoritmi prikazani u ovoj maturalnoj radnji openito se koriste za rjeavanje c s praktinih problema u teoriji grafova pa koriste razumne koliine resursa c c (poput raunalne memorije i procesorskog vremena). Naalost, kao to je ve c z s c spomenuto u odjeljku o Hamiltonovim ciklusima (str. 12.), za neke probleme jo nisu otkriveni ekasni algoritmi. Sto je jo gore, nije nam poznato postoje s s li uope ekasni algoritmi za takve probleme. c Spomenuli smo slijedei problem: Pronadi najkrai put od vrha x do c c vrha y. U prethodnom poglavlju vidjeli smo vrlo brz i ekasan algoritam koji nam ovo rjeava. No, ako se zapitamo koji je najdulji put (bez ciklusa) od x s do y, imamo problem za koji nitko ne zna pametnije rjeenje od provjere svih s moguih putova. Algoritam za takav problem mogao bi imati eksponencijalno c vrijeme izvravanja. s Openito, moemo rei da je eksponencijalno vrijeme izvravanja algoc z c s ritma proporcionalno s barem 2N za unos veliine N. To znai da, na pric c mjer, ne moemo garantirati da e algoritam s eksponencijalnim vremenom z c izvravanja raditi za unos veliine 100 ili vie jer nitko ne moe ekati da s c s z c algoritam napravi 2100 koraka. Napredak tehnologije ne znai nita u uspoc s redbi s eksponencijalnim rastom: superraunalo moe biti trilijun puta bre c z z od abakusa, ali ni jedan ni drugi nisu ni blizu rjeavanju problema koji ima s 2100 koraka. No svejedno, problemi za koje ne postoji ekasno rjeenje ne mogu se s ignorirati. Uzmimo za primjer problem trgovakog putnika za ije je rjeenje c c s naivnom provjerom svih putova potrebno vrijeme proporcionalno s N!. Ovaj

30

Poglavlje 6. Zakljuak c

31

problem se vrlo esto pojavljuje. I to da sad trgovaki putnik radi kad smo c s c mi nemoni da rijeimo problem za, primjerice, 1000 vrhova? Da se radije c s prihvati uzgoja krumpira? Na generacijama koje dolaze ostaje da pokuaju rijeiti ove probleme. s s Kao to smo vidjeli, tehnoloki napredak nije toliko znaajan. Stvarni nas s c predak ovjeanstva ostvaruje se na podrujima kao to je matematika. c c c s Ovom maturalnom radnjom dotaknuo sam samo mali dio teorije grafova i algoritama koji se u njoj primjenjuju. Primjerice, nisam pisao o problemima protoka u transportnim mreama koji se uestalo javljaju. Ovi proz c blemi obuhvaaju pitanja poput koju ulicu u gradu treba proiriti da bi se c s sprijeio prometni kolaps i sl. Takoder, nisam pisao o problemima sparivac nja u bipartitnim grafovima. To su problemi poput slijedeeg: n djeaka i c c djevojica sudjeluje u kolskom plesu. Svaki djeak eli plesati samo s nec s c z kim djevojicama, a svaka djevojica eli plesati samo s nekim djeacima. c c z c Pronadi najvei broj plesnih parova. c Pisanje o tim temama bi uinilo maturalni rad preopirnim. Citatelj se c s upuuje na naslove iz bibliograje ako ga one posebno zanimaju. c

Bibliograja[1] R. Sedgewick: Algorithms in C, Addison-Wesley Publishing Company, 1990. [2] T. H. Cormen, C. E. Leiserson, R. L. Rivest: Introduction to Algorithms, The MIT Press, 1990. [3] D. Veljan: Kombinatorna i diskretna matematika, Algoritam, 2001.

32