SADRZAJ
Uvod _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 3 1.0Orijentisan i neorijentisani graf _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 4
Terminologija _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
_ _ _ _ 4 2.0 Predstavljanje grafa pomocu racunara _ _ _ _ _ _ _ _ _ _ _ _ _ 5 LISTA SUSEDSTVA _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 5
MATRICA INCIDENTNOSTI _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 6-7
MATRICA SUSEDSTVA _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 8-9
Flojdov algoritam _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 2.1 Flojdov algoritam 10 _ _ _ _ 10
2.2 Osnovne operacije nad grafom _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 10 10
Ostale operacije _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 10
2.3 Implementacija grafova u programskom jeziku C++ _ _ _ 11
Implementaci ja ja čvora
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _11
Implementacija grane _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 12
Implementacija grafa _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 13
Dodavanje čvora u graf _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ __ _ _ 14
Dodavanje grane u graf _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 14
Zakljucak _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 15
Uvod Grafovi se mogu koristiti za rešavanje mnogih praktičnih problema. Takve probleme rešavamo pomoću računara. Iz tih razloga potrebno je na adekvatan način predstaviti grafove. Ne postoji neka unverzalna reprezentacija grafova koja bi rešila sve različite probleme u kojima se oni koriste. Jedan od uobičajenih načina je pomoću listi susedstva, matrica incidencije i susedstva. Grag je apstraktni matematicki objekat, a crtez koji se sastoji od tacaka i linija je samo geometrijska predstava grafa. Medjutim, uobicajno je da se takva slika naziva grafom. Pa posto je graf sastavljen iz tacaka i linija,koje spajaju po dve tacke, onda je odatle moguce izvesti i formalnu definiciju grafa . Graf primenjujemo ne samo u matematici, vec i u informatici,elektrotehnici i tehnici uopste,a takodje i u hemiji, ekonomiji i u mnogim drugim oblastima. Teorija grafova je oblast matematike, veoma zastupljena u informatici, cija je oblast istrazivanje osobina grafova. Neformalno govoreci , grafovi su sastavljeni od tacaka, odnosno cvorova, i linija medju njima, odnosno grana .
2
Sastoje se od: • •
Čvorova (tacaka) Grane (linije,rub)
Definicija • Graf ( engl. graph ) je uređeni par G = (V,E) , gde je V konačan neprazan skup elemenata koji se nazivajučvorovi ili temena ( engl. node ), a E konačan skup uređenih parova čvorova, tj. E ⊆ V ×V. Elementiskupa E nazivaju se grane ili potezi ( engl. edge )grafa.
•
Graf G je par skupova ( V, E), gde je V konacan ne prazan skup, a skup E predstavlja binarne relacije elemenata skupa V. • Elementi skupa V se nazivaju cvorovi, a elementi skupa E grane. • Broj elemnata skupa V se naziva red grafa. • U realnim problemima cvorovi predstavljaju objekte , a grane odnose izmedju njih.
1.0 Orijentisan i neorijentisani graf Prethodna definicija odnosi se na takozvani orijentisani graf (digraf )Ukoliko se skup grana E definiše kao skup parova čvorova,E = { {u,v}| u,v∈V ∧ u ≠ v }, graf je neorijentisan.
Terminologija • Granu e orijentisanog grafa izvire iz čvora v akose čvor v javlja kao prvi čvor u uređenom parukoji definiše dati poteg e = (v,u), a ukoliko senalazi kao drugi član uređenog para e = (u,v), kazese da uvire u dati čvor.
3
• Izlazni stepen nekog čvora je broj potega kojiizvire iz njega, a ulazni stepen, broj potega kojiuviru u njega. Stepen čvora je zbir ulaznog i izlaznog stepena. • Put P u usmerenom grafu G = (V,E) je neprazanniz čvorova P = (v1, v2, ... vk) takvih da važi:( ∀vi∈V ) ( 1≤ i ≤ k ⇒ (vi, vi+1)∈E ). • Dužina puta P je k-1, odnosno, broj potega kojetreba preći da bi se iz prvog stiglo u poslednji čvortog puta. • Čvor vi+1 naziva se sledbenik čvora vi, a čvor vi-1 prethodnik . • Put jeprost ako i samo ako važi:( ∀(vi,vj)∈V ) ( 1 ≤ i < j ≤ k ⇒ vi ≠ vj ) • Ciklus je put kod koga se poklapaju prvi iposlednji čvor, tj. važi: v1 = vk. • Ciklus je prost ako zadovoljava uslovjednostavnog puta. • Ciklus dužine 1 naziva se petlja. • Usmereni graf koji ne sadrži cikluse naziva se usmereni aciklični graf . (Primer takvog grafa je stablo) • Težinski grafovi - grafovi kod kojih su dodeljeni težinski koeficijenati granama
2.0 Predstavljanje grafa pomocu racunara Predstavljanje grafova Postoje dva standardna nacina za predstavljanje grafa G =( V, E ): • Kolekcija lista povezanosti • Matrica povezanosti i jedan i drugi nacin su primenjivi i na usmerene i na neusmerene grafove . Predstavljanje grafa pomocu lista povezanosti omogucava kompaktno cuvanje retkih (razudjenih) grafova, kod kojih je broj veza | E | mnogo manji od kvadrata broja cvorova | V |. Koriscenje matrice povezanosti se sa druge strane koristi u slucaju gustih grafova, gde je broj veza | E | priblizan broja cvorova | V | ili kada je potrebno brzo doci do informacije da li izmedju neka dva cvora postoji veza. Predstavljanje grafa G = ( V, E ) pomocu lista povezanosti sastoji se od niza Adj, koji sadrzi | V | lista, po jednu za svaki cvor iz skupa V . Za svaki cvor u V, lista povezanosti 4
Adj [u] sadrzi sve cvorove v takve da postoji veza ( u, v ) ∈ E. To Zapravo znaci da lista Adj [ u ] sadrzi sve cvorove grafa G koji su povezani sa cvorom u . Cvorovi u listi povezanosti su obicno poredjani projzvoljnim redosledom.
LISTA SUSEDSTVA
Za svaki čvor grafa G=(V,E) lista susedstva sadrži sve čvorove koji su susedni sa nim u G, l = { v ∈V ( u ,v ) ∈ E } Primer: Grafu sa slike odgovara sledeća lista susedstva
b
l
u
( b c d ) b ( a) c ( a d ) d ( a c ) a
d a
,
,
,
,
c Lista susedstva je sa memorijskih resursa najekonomičnija reprezentacija grafova. Svaka grana grafa ili digrafa predstavlja se sa 2 memorijske jedinice, jedna za početni čvor, a druga za krajnji čvor grane. Dakle graf je reprezentovan sa 2m lokacija ( m je broj grana) Međutim ova reprezentacija nije uvek pogodna, pogotovo kod grafova kod kojih je potrebno utvrđivati susednost čvorova.
MATRICA INCIDENTNOSTI
Ako (a,b) predstavlja granu, a čvorovi a i b su krajnje tačke grane, za granu (a,b) se kaže da je incidentna čvorovima a i b. Neka je G=(V,E) graf. Matrica B čije su vrste obeležene čvorovima grafa a kolone granama grafa naziva se matrica incidencije. Element bij , jednak je 1 ako je i-ti čvor incidentan j-toj grani , a jednak nuli u protivnom.
Primer: Grafu sa slike odgovara sledeća matrica incidencije
5
b e1 e 2
e1
a 1
e2
a
e3
1
e3
1
e4
0
0 0 0 c 0 0 1 1 d 0 1 0 1
d
b 1
e4
c
Matrice incidencije mogu da se koristite i kod grafova sa petljama Primer: Grafu sa petljama sa slike odgovara sledeća matrica incidencije
b
e2
e1
e1
e5
a 1
e3
e3
1
1
e4
0
e5
0
0 0 0 0 c 0 0 1 1 0 d 0 0 0 1 0
d
a
e2
b 1
e4
c
Matrica incidencije za neorijentisane grafove se definiše tako što ako je i-ti čvor susedan ili incidentan sa j-tom granom pišemo 1, inače je 0. Kod digrafova na preseku i-te vrste i j-te kolone stoji -1 ili 1 ako u i-ti čvor ulazi, odnosno izlazi j-ta grana, inače je 0. Ova reprezentacija je veoma neekonomična ( u svakoj koloni bez obzira na graf nalaze se samo dva ne nulta elementa ) i ređe se koristi. Matrice susedstva i incidencije imaju osobinu da njihovi stepeni daju informaciju o susedstvu čvorova i šetnjama proizvoljnih dužina.
Teorema: k Ako je A matrica grafa G, k ∈ N U{ 0} , gde su u, v , čvorovi, onda element Au ,v jednak
broju šetnji dužine k od u do v.
Put dužine 0 sastoji se samo od jednog čvora.
1, u = v 0 , A = I = w0 ( u , v ) 0, u ≠ v
w0 ( u , v ) =
.
6
Ovo je jedan od načina da se odredi rastojanje između čvorova. Primer:
1 1 2 Uočimo matricu A = 0 1
1 1 0 1 0 e 0 0 1 0 1 1 0 1 0 0
1
0
0 1
. 0 0 1 1 1 0 0 1
0
Uočimo na primer da je a12 2 = ( a11 ∧ a21 ) ∨ ( a12 ∧ a22 ) ∨ ( a13 ∧ a32 ) ∨ ( a14 ∧ a42 ) =
( 1 ∧ 0 ) ∨ ( 0 ∧ 0 ) ∨ ( 0 ∧ 0 ) ∨ ( 1∧ 1) = 0 ∨ 0 ∨ 0 ∨ 1 = 1 Kako je a12 = 1 i pošto su a14 = 1, a42 = 1 , postoji grana od čvora 1 do čvora 4 i na isti način od čvora 4 do čvora 2. Na osnovu toga postoji put dužine 2 od čvora 1 do čvora 2. 2 Tada možemo zaključiti da ja Aij = 1 ako postoji pu dužine 2 od čvora i do čvora j. 2
Ali za a34 2 = ( a31 ∧ a14 ) ∨ ( a32 ∧ a24 ) ∨ ( a33 ∧ a34 ) ∨ ( a34 ∧ a44 ) =
( 0 ∧ 1) ∨ ( 0 ∧ 0 ) ∨ ( 0 ∧ 1) ∨ ( 1∧ 0) = 0 ∨ 0 ∨ 0 ∨ 0 = 0 I zaključujemo da ne postoji put dužine 2 od čvora 3 do čvora 4.
MATRICA SUSEDSTVA
Neka je G=(V,E) graf . Matrica A čije su vrste obeležene čvorovima grafa, a kolone istim tim čvorovima u istom poretku, se zove matrica susedstva . Element Adj , jednak je 1 ako postoji grana od i-tog čvora do j-tog čvora , a jednak nuli u protivnom. Matrica susedstva grafa G = ( V , E ) je kvadratna matrica V × V , za koju važi
1, { u , v} ∈ E A = 0, { u, v} ∉ E Matrica susedstva je kvadratna matrica simetrična u odnosu na glavnu dijagonalu. Primer:
7
Grafu sa slike odgovara sledeća matrica susedstva
b
e1
a
b
c
a 0 1 eb2 1d 0 c 1 0 e d 1 4 0 c
a
e3
d
1 1
0 1 1 0 0 0
Kako oznake čvorova u većini slučajeva nisu važne, matrica se piše bez oznaka
0 1 1 1
1
1
0
0
1 0
0 0 1 0 1 0
Primer: Usmerenom grafu sa slike odgovara matrica susedstva
a
b
c
a 0 1 1
b
a
c
b 1 1 1
c 0 0 0 8
Matrica susedstva je najčešća matrična interpretacija grafova. Ova reprezentacija zahteva ( n je broj čvorova ) memoriskih jedinica u računaru i veoma je nepraktična za grafove sa malim brojem grana što je u praksi čest slučaj. Sa druge strane ona može da se koristi i za grafove, i multigrafove ( digfraove ). Tada , na poziciju preseka i-te vrste i j-te kolone treba staviti broj grana koje spajaju i-ti čvor sa j-tim čvorom. U slučaju da je graf neorijentisan skoro 50% memoriskih jedinica možemo uštedeti ako se pamte samo elementi ispod ili iznad glavne dijagonale, zato što je matrica simetrična. Ali tada se usporava brizna rada jer je potrebno izvršiti testiranja koja se nameću. Težinska matrica je matrica kod koje na poziciju preseka i-te vrste i j-te kolone treba staviti težinu wij grane koje spajaja i-ti čvor sa j-tim čvorom. Ako neka grana ne postoji, tada se na pomenutu poziciju stavlja neki poseban simbol . U slučaju bestežinskih grafova, za postojeće grane se podrazumeva težina 1, dok za nepostojeće grane koristi se 0. Težinska matrica je neka vrsta generalizacije matrice susedstva.
2.1 Flojdov algoritam Inicijalno, matrica najkraćih puteva postavlja se na vrednosti težina grana.
Flojdov algoritam zatim računa matrice D1, D2, ... DV, korišćenjem sledeće formule: kojom se za svaki par čvorova (v,w) proverava da li je rastojanje D(v,w), 9
koje predstavlja najkraći put od v do w koji ne prolazi kroz vi+1 duže od zbira najkraćih rastojanja od v do vi+1 i od vi+1 do w. Ako jeste, novo najkraće rastojanje predstavlja sumu najkraćih puteva preko čvora vi+1.
2.2 Osnovne operacije nad grafom • findNode - pronalazi zadati čvor u grafu, ukolikopostoji, • insertNode - dodaje novi čvor, • deleteNode - briše zadati čvor, ukoliko postoji, • findEdge - pronalazi zadati poteg u grafu, ukolikopostoji, • insertEdge - dodaje poteg između dva zadatačvora i • deleteEdge - briše poteg između dva zadata čvora,ukoliko postoji Ostale operacije • obilazak grafa (po širini - breadthTrav idubini - depthTrav), • topološko uređenje( topologicalOrderTraversal), • provera postojanja ciklusa ( isCyclic), • povezanost grafa ( connectionLevel) i • nalaženje najkraćeg puta ( findShortestPath)
2.2 Implementacija grafova u programskom jeziku C++: Navedeni kod je rađen preko templejtskih klasa da bi lako mogli da menjamo tip podatka čvora (int ,double...).
Implementacija čvora:
10
template class LinkedNode { public: T node; // Kreiramo čvor tipa T Edge* adj; // Kreiramo granu LinkedNode* next; // Pokazivac na susedni čvor int status; // Status ( moze biti 0 – smešten, 1 – obrađuje se, 2 – obrađen) inline LinkedNode() // Konstruktor klase LinkedNode { adj=NULL; next=NULL; status=0; //vrsimo inicijalizaciju promenljivih } inline LinkedNode(T nodeN) // Konstruktor s prosleđenim parametrom kojim // postavljamo vrednost čvora { node=nodeN; adj=NULL; next=NULL; status=0; } inline void Visit() { cout << node << endl; // ovom funkcijom štampamo vrednost čvora }
};
Implementacija grane:
11
template class Edge { public: LinkedNode* dest; //pokazivač na odredišni čvor Edge* link ; // pokazivač na sledeću granu (kod lančane // reprezentacije za prelazak na sledeću granu) W weight; // tezina grane (kod tezinskih grafova) inline Edge() //Konstruktor klase Edge { dest=NULL; link=NULL; //inicijalizujemo promenljive } //Konstruktor sa prosleđenim parametrima kojima postavljamo pokazivač //na čvor i narednu granu inline Edge(LinkedNode* destN,Edge* linkN) { dest=destN; link=linkN; } };
12
Implementacija grafa
template class GraphAsList protected: LinkedNode* start; // Pokazivac koji ukazuje na startni element grafa // npr kad vrsimo obilazak grafa long nodeNum; //broj čvorova u grafu public: //Konstuktor kojim inicijalizujemo promenljive inline GraphAsLists() {start ==NULL; nodeNum=0; } ~GraphAsLists(); // Destruktor LinkedNode* findNode(T pod); // Funkcija za trazenje čvora Edge* findEdge(T a, T b); // Funkcija za traženje grane bool insertNode(T pod); // Funkcija za dodavanje čvora bool deleteNode(T pod); // Funkcija za brisanje čvora bool insertEdge(T a, T b); Funkcija za dodavanje grane bool deleteEdge(T a, T b); // Funkcija za brisanje grane long breadthTrav(T a); // Obilazak po širini long depthTrav(T a); // Obilazak po dubini long topologicalOrderTrav(); // Topološki obilazak void print(); // Štampanje svih elemenata grafa protected: void deleteEdgeToNode(LinkedNode* ptr); // Brisanje grane ka zadatom // čvoru }
13
//Dodavanje čvora u graf
template bool GraphAsLists::insertNode(T pod) { LinkedNode* newNode= new LinkedNode(pod, NULL, start, 0); //Pravimo novi čvor pozivanjem konstruktora klase LinkedNode i saljemo // //parametre (postavljamo vrednost čvora na „pod” , granu na NULL, postavljamo čvor //startni i status na 0(neobradjen) if(newNode == NULL) return false; //ukoliko se ne kreira čvor vraćamo false start=newNode; //kazemo da je novi čvor startni nodeNum++; // uvećavamo ukupan broj čvorova return true; //uspesno dodavanje, vraćamo true }
//Dodavanje grane u graf
template bool GraphAsLists::insertEdge(T a, T b) { LinkedNode* pa = findNode(a); //Trazimo čvor „a” LinkedNode* pb = findNode(b); //Trazimo čvor „b” if(pa == NULL || pb == NULL) return false; //Ukoliko ne postoje vraćamo false Edge* ptr = new Edge(pb,pa->adj); //Ukoloko postoje dodajemo //granu između ta dva čvora if(ptr == NULL) return false; //Ukoliko nije uspelo dodavanje grane vraćamo // false pa->adj = ptr; //Postavljamo ovu novu granu kao prvu granu čvora a return true; // Sve je prošlo bez greške, vraćamo true }
14
Literatura
1. Vojislav Petrović "Teorija grafova"Univerzitet u Novom
2.
3.
4.
Sadu,PMF 1998 . Igor Dolinka, Kratak uvod u analizu algoritama, Univerzitet u Novom Sadu, Novi Sad, 2008 A. Bondy, U.R.S. Murty, Graph Theory, Graduate Texts in Mathematics, Springer, 2007 Douglas B. West, Introduction to Graph Theory, 2nd Ed, Prentice Hall, 2001.
5.
http://www.is.pmf.uns.ac.rs/skrbics/download/PetnicaGrafoviIMatr ice.pdf
6.
http://elib.mi.sanu.ac.rs/files/journals/nm/208/nm41340 7.pdf
7.
http://sr.wikipedia.org/sr-el/Граф_(структура_података)
15