Vous êtes sur la page 1sur 5

Elementarni algoritmi pretraivanja grafova

Kad jednom imamo graf postavlja nam se problem kako iz zadanog grafa dobiti neke bitne
strukturalne informacije o samom grafu, tj. da li je graf povezan i ako nije, od koliko se
komponenta povezanosti sastoji te da li graf sadri ciklus? Postoje dva algoritma koja
sustavno obilaze graf i moemo ih iskoristiti pri rjeavanju ovih problema, a to su
pretraivanje grafa u dubinu i pretraivanje grafa u irinu.

1. Pretraivanje grafa u dubinu.


Sama ideja algoritma je u tome da u svakom koraku pokuamo u grafu otii to je dublje
mogue. Ta se ideja moe veoma lako pokazati na sljedeem primjeru.
A

F
Slika 1. Primjer grafa na kojem emo demonstrirati izvoenje pretraivanja u dubinu

Zadani graf obii emo u dubinu poevi od vrha A.


A

Slika 2. Izvoenje pretraivanja u dubinu

Slika 3. Izvoenje pretraivanja u dubinu (nastavak)

Poevi od vrha A pronalazimo njemu prvi susjedni vrh te nastavimo pretraivati u dubinu
od njega na dalje. Ukoliko naiemo na vrh koji smo ve obili ili vrh od kojeg ne moemo ii
dalje, vraamo se natrag kroz graf dok ne naiemo na vrh iz kojeg postoji brid kojim nismo
proli. Kao to je iz primjera vidljivo redosljed nailaenja vrhova je A, B, C, F, D, E, G.
Nakon to je algoritam naiao na E pokuava otii dalje u dubinu bridom EF, meutim vrh F
je ve obien u nekom prethodnom koraku. Isto tako pokuava se dalje poi bridom GA te je
ishod isti kao i s bridom EF.
Uz ovakav nain prikazivanja izvoenja algoritma mogu je i prikaz uz pomo stabla
pretraivanja u dubinu. Takvo je stablo u biti samo drugaiji nain crtanja grafa kojeg
istraujemo. Prikaz takvog stabla za prethodni primjer dan je sljedeom slikom.
A

E
G
Slika 4. Stablo pretraivanja u dubinu

Bridovi oznaeni punom crtom oznaavaju da je vrh koji je nie u stablu pronaen u listi
susjedstva njemu nadreenog vrha te da taj vrh u prethodnom dijelu algoritma nismo susreli.
Crtkani bridovi su oni bridovi koji vode prema ve obienim vrhovima. Bitno svojstvo
neusmjerenih grafova je to da crtkani bridovi uvijek vode od nekog vrha nie u stablu prema
nekom vrhu koji mu je predak u stablu.
U toku izvoenja algoritma vrhove grafa moemo u svakom trenutku svrstati u tri klase. U
prvu klasu spadaju svi vrhovi koji su potpuno obraeni, u drugu oni koji su djelomino
obraeni dok u treu oni koji jo nisu vieni. U toku izvoenja aloritma nailaskom na vrh
kojeg jo nismo susreli u stablo pretraivanja dodajemo brid koji je oznaen punom crtom,
dok kad naiemo na vrh koji je ve obraen u stablo dodajemo crtkani brid. Kod
neusmjerenih grafova nikad neemo pronai brid koji vodi od vrha koji je obraen prema
nekom vrhu neke druge klase.

Algoritam:
Obilazak_grafa(G)
Za svaki vrh v koji nije oznaen kao vrh kojeg smo obradili
Obilazak_u_dubinu(G,v);
Obilazak_u_dubinu(G,v)
Oznai v;
Za svaki vrh u koji je susjedan v a nije oznaen
Obilazak_u_dubinu(G,u);

Nerekurzivna implementacija:
Uklanjanje rekurzije vrimo tako da koristimo stog kako bismo pamtili koji vrh treba u
sljedeem koraku obraditi.
Obilazak_u_dubinu(G,v)
Stavi v na stog;
Dok stog nije prazan
Skini v sa stoga;
Oznai v;
Za svaki vrh u koji je susjedan v i nije oznaen
Stavi u na stog;

2. Pretraivanje grafa u irinu


Slino kao kod pretraivanja grafa u dubinu, ovaj algoritam sistematski obilazi sve vrhove
grafa, ali tako da u svakom koraku nastoji ii to je ire mogue. Na sljedeoj je slici
primjer pretraivanj grafa u irinu za graf na kojem smo prikazivali pretraivanje u dubinu.
A

Slika 5. Izvoenje pretraivanja u irinu

Kako bismo pokazali jedno bitno svojstvo pretraivanja grafa u irinu trebamo prvo uvesti
pojam udaljenosti u grafu.
Definicija: Za put p u grafu G od v do u, u oznaci v u, kaemo da je duine l ukoliko
sadri l bridova i to oznaimo s d(p)=l. Najkrau udaljenost vrhova u i v definiramo kao
duinu najkraeg puta izmeu ta dva vrha i oznaavamo sa (u,v).
Kao to je iz primjera vidljivo, algoritam nikad ne zapoinje obilazak vrhova koji su
udaljeni od poetnog vrha n+1 brid prije no to je obradio sve vrhove koji su od poetnog
vrha udaljeni n bridova.

Slino kao i kod pretraivanja u dubinu, rezultat izvoenja algoritma moemo prikazati
stablom pretraivanja u irinu. Takvo stablo za prethodni primjer dano je na sljedeoj slici.
A

Slika 6. Stablo pretraivanja u irinu

Algoritam:
Kako bi se implementirao ovaj algoritam potrebno je upotrijebiti red koji nam govori koji
vrh treba u sljedeem koraku obraditi.
Obilazak_grafa(G)
Za svaki vrh v koji nije oznaen kao vrh kojeg smo obradili
Obilazak_u_irinu(G,v);
Obilazak_u_irinu(G,v)
Stavi v u red;
Dok red nije prazan
Skini v iz reda;
Oznai v;
Za svaki vrh u koji je susjedan v i nije oznaen
Stavi u u red;

Nakon to smo objasnili kako ova dva algoritma funkcioniraju bilo bi dobro objasniti neke
od njihovih primjena. Povezanost grafa je direktno vezana uz broj poziva jedne od procedura
za obilazak grafa iz procedure Obilazak_grafa(G), svakim pozivom iz te procedure
dobivamo jednu komponentu povezanosti. Ukoliko graf sadri ciklus tada u stablu kojeg
gradimo u toku obilaska postoji brid kojeg oznaavamo crtkano. Uklanjanjem takvih bridova
iz poetnog grafa dobivamo razapinjajue stablo.
Veina algoritama na grafovima sastoji se od veih ili manjih modifikacija ovih osnovnih
algoritama pretraivanja grafa. Moemo navesti neke: pronalaenje separirajuih vrhova,
pronalaenje mostova, pronalaenje minimalnog razapinjajueg stabla, pronalaenje
minimalnih udaljenosti od jednog vrha do svih ostalih

Vous aimerez peut-être aussi