Programiranje 2 Grafovi

22
PROGRAMIRANJE II P-08: Grafovi doc. dr Dražen Brđanin 2014/15

description

Programiranje 2 Grafovi

Transcript of Programiranje 2 Grafovi

  • PROGRAMIRANJE IIP-08: Grafovidoc. dr Draen Branin2014/15

  • P-08: Grafovi Sadraj predavanjaOsnovni pojmovi o grafovimaReprezentacija grafaObilazak grafaObuhvatno stabloNajkraa rastojanja

  • Osnovni pojmovi o grafovimaGRAF:nelinearna struktura podataka koju ini:V - skup vorova (nodes/vertices), i E - kolekcija grana (edges/arcs)granepredstavljaju binarne veze (odnose) izmeu vorovakoriste se za modelovanje proizvoljnih nelinearnih relacijagrane mogu biti: neusmjerene (simetrine) i usmjerene (asimetrine)neusmjereni graf usmjereni graf mjeoviti grafABCFDEvorovigraneABCFDEsve veze u grafu su neusmjerene

    sve veze u grafu su usmjerene

    u grafu postoje i usmjerene i neusmjerene veze

  • Osnovni pojmovi o grafovimaBulazne grane vora(grane usmjerenog grafa koje ulaze u dati vor)Cizlazne grane vora(grane usmjerenog grafa koje izlaze iz datog vora)Ulazni stepen vora (in-degree): broj ulaznih grana u voruindeg(B)=3Izlazni stepen vora (out-degree): broj izlaznih grana iz voraoutdeg(C)=5DStepen vora (degree): ukupan broj ulaznih i izlaznih grana u datom vorudeg(D)=4Po definiciji, graf ine skup vorova i kolekcija grana:svaka grana predstavlja vezu izmeu para vorovaizmeu neka dva vora mogu da postoje paralelne ili viestruke veze/grane (npr. izmeu vorova u elektr. mrei moe da postoji vie grana)ABPetlja: grana koja poinje i zavrava istim voromAProsti graf: graf u kojem nema petlji i viestrukih veza

  • Osnovni pojmovi o grafovimaPut/Putanja (path): alternativna (naizmjenina) sekvenca povezanih vorova i grana (vor-grana-vor-...-vor) izmeu neka dva vora u grafuABCFDEADECiklus (cycle): putanja koja ima isti poetni i krajnji vorABCFDECDEProsta putanja svi vorovi u putanji su razliiti (nijedan vor nije sadran vie puta)Prosti ciklus svi vorovi u ciklusu (osim poetnog i krajnjeg) su razliitiUsmjerena putanja sve grane u putanji su usmjerene i obilaze se u odgovarajuem smjeru Usmjereni ciklus sve grane u ciklusu su usmjerene i obilaze se u odgovarajuem smjeruNpr. putanja A-(A,D)-D-(D,E)-E je prosta (svaki vor sadran samo jednom) i usmjerena (obje grane su usmjerene i obilaze se u adekvatnom smjeru)Npr. ciklus C-(C,D)-D-(D,E)-E-(E,C)-C je prost (svaki vor osim C je sadran samo jednom) i usmjeren (sve grane su usmjerene i obilaze se u adekvatnom smjeru)

  • Osnovni pojmovi o grafovimaPodgraf grafa G je graf P iji su vorovi i grane podskupovi vorova i grana grafa GABCFDEACDEABCDPovezani graf je graf u kojem izmeu svaka dva vora postoji putanjaNepovezani graf je graf u kojem postoje vorovi izmeu kojih ne postoje putanjePovezane komponente su najvei povezani podgrafovi u nepovezanom grafuABCDGFHEStablo je povezani graf bez ciklusaABCFDEFCABDEkorjeno stablo (rooted tree)slobodno stablo (free tree)

  • Reprezentacija grafa 0i 12345Matrina reprezentacija (matrica susjednosti)Sadraj matrice definie se na sljedei nainABCFDE012345j000000100100100010101000000100000010 012345ABCFDE012345011100100100100110111010001101000010usmjereni grafneusmjereni graf

  • Reprezentacija grafaTeinski grafGrane imaju teinu (npr. cijena, duina, ...)ABCFDESadraj matrice susjednosti za teinske grafove5020302080507060ABCFDE5020302080507060 0123450123450705080007000600050005020080605002000020200300000300

  • Reprezentacija grafaUlanana reprezentacija (lista susjednosti)Graf se predstavlja pomou:vektora zaglavlja za svaki vor grafaulanane liste za svaki vor grafasvaki element u listi reprezentuje jednu granu

    123645usmjereni graf123645neusmjereni graf

  • Obilazak grafaObilazak (eng. traversal) grafa:sistematina procedura kojom se svaki vor u grafu posjeti (obradi) samo jednomna neki vor moe da se naie vie puta, ali se samo prvi put posjeti (obradi):graf nema neki specifian vor (kao to korjeno stablo ima korijen) od kojeg bi zapoeo obilazakako se neki vor ne posjeti zbog nedostinosti, nastavlja se sa nekim neposjeenimobilazak moe da zapone od:eksplicitno zadatog vora sluajno izabranog vorporedak (rezultat obilaska) zavisi od:izbora poetnog vorastrategije (algoritma) obilaskaosnovni algoritmi za obilazak grafa zasnovani na susjednosti:obilazak po irini (BFS)obilazak po dubini (DFS)

  • Obilazak grafaObilazak grafa po dubini:procedura veoma slina preorder obilasku korjenog stablastrategija obilaska:posjeti poetni vor posjeti jednog njegovog susjedaposjeti neposjeenog susjeda prethodnog voraako nema neposjeenog susjeda, vrati se na posljednjeg prethodnika koji ima neposjeenog susjedapotreban pomoni niz koji sadri informaciju o posjeenim vorovima, na poetku: for i=1 to n do visit[i]=FALSE rekurzivni obilazak od nekog vora u: DFS(u) visit[u]=TRUE OBRADA(u) for { v, (u,v)E } do if visit[v]=FALSE then DFS(v)

  • Obilazak grafaPrimjer: Obii dati graf po dubini poevi od vora 1123645Fv[1]123645123645Fv[2]Fv[3]Fv[4]Fv[5]Fv[6]Tv[1]Fv[2]Fv[3]Fv[4]Fv[5]Fv[6]Tv[1]Tv[2]Fv[3]Fv[4]Fv[5]Fv[6]123645Tv[1]Tv[2]Fv[3]Tv[4]Fv[5]Fv[6]123645Tv[1]Tv[2]Tv[3]Tv[4]Fv[5]Fv[6]123645Tv[1]Tv[2]Tv[3]Tv[4]Tv[5]Fv[6]123645Tv[1]Tv[2]Tv[3]Tv[4]Tv[5]Tv[6]Rezultat obilaska:

  • Obilazak grafa/* obilazak grafa po dubini */#include #define MAX 10typedef struct G { int n; char nodes[MAX]; int ms[MAX][MAX]; } GRAF;void DFS(GRAF *g){ int visit[MAX]={}; void dfs_visit(int u) { int v; printf("%c",g->nodes[u]); visit[u]=1; for (v=0; vn; v++) if (g->ms[u][v] && !visit[v]) dfs_visit(v); } dfs_visit(0);}void main(){ GRAF g = { 6, {'1','2','3','4','5','6'}, { {0,1,1,1,0,0}, {1,0,0,1,0,0}, {1,0,0,1,1,0}, {1,1,1,0,1,0}, {0,0,1,1,0,1}, {0,0,0,0,1,0} }}; DFS(&g);}GRAF je struktura koja reprezentuje graf:n broj vorovanodes nazivi vorovams matrica susjednosti DFS je funkcija za obilazak grafa (uvijek od vora 0):visit pomoni nizdfs_visit obilazi grafGRAF g reprezentuje graf iz prethodnog primjeraRezultat obilaska: 124356

  • Obuhvatno stablo (stablo razapinjanja)Obuhvatno stablo S(U,E) povezanog neusmjerenog grafa G(V,E):sadri sve vorove grafa (U=V)sadri odreen broj grana iz grafa tako da su svi vorovi povezani, ali bez ciklusa (EE) DABCEDABCEDABCEDABCEDABCEObuhvatno stablo = slobodno stablobroj grana: n-1 (n broj vorova)moe da se generie prilikom DFS ili BFS obilaska(kad se doe do neposjeenog vora, u skup E se ukljui dolazna grana)obuhvatno stablo (eng. spanning tree)

  • Obuhvatno stablo (stablo razapinjanja)Primjer: Formirati obuhvatno stablo obilaskom grafa po dubini poevi od vora 1123645123645Tv[1]Fv[2]Fv[3]Fv[4]Fv[5]Fv[6]Tv[1]Tv[2]Fv[3]Fv[4]Fv[5]Fv[6]123645Tv[1]Tv[2]Tv[3]Tv[4]Fv[5]Fv[6]123645Tv[1]Tv[2]Tv[3]Tv[4]Tv[5]Fv[6]123645Tv[1]Tv[2]Tv[3]Tv[4]Tv[5]Tv[6]123645Tv[1]Tv[2]Fv[3]Tv[4]Fv[5]Fv[6]123645 1 23456123456010000100100000110011000001001000010123645

  • Obuhvatno stablo (stablo razapinjanja)/* formiranje obuhvatnog stabla obilaskom grafa po dubini */#include #define MAX 10typedef struct G { int n; char nodes[MAX]; int ms[MAX][MAX]; } GRAF;void ST_DFS(GRAF *g, GRAF *st){ int visit[MAX]={}; void dfs_visit(int u) { int v; visit[u]=1; for (v=0; vn; v++) if (g->ms[u][v] && !visit[v]) { st->ms[u][v]=st->ms[v][u]=1; dfs_visit(v); } } dfs_visit(0);}void main(){ int i,j; GRAF g = { 6, {'1','2','3','4','5','6'}, { {0,1,1,1,0,0},{1,0,0,1,0,0},{1,0,0,1,1,0},{1,1,1,0,1,0},{0,0,1,1,0,1},{0,0,0,0,1,0} }}; GRAF st = { 6, {'1','2','3','4','5','6'} }; ST_DFS(&g, &st); for (i=0; i
  • Minimalno obuhvatno stabloMinimalno obuhvatno stablo S(U,E) je obuhvatno stablo minimalne cijene/teinecijena stabla:PRIM-ov ALGORITAM za MSTinkrementalno gradi MST, poevi od inicijalnog vora, dodavanjem po jednu granu i jedan vorBira granu najmanje teine meu granama koje povezuju vorove ve ukljuene u MST i vorove koji jo nisu PRIM(G,s) U={s} E= while (UV) do find(u,v) min {w(u,v) : (uU)(v(V-U))} U=U+{v} E=E+{(u,v)} end_while MST=(U,E) (minimal spanning tree - MST)

  • Minimalno obuhvatno stabloPrimjer: Formirati minimalno obuhvatno stablo primjenom Primovog algoritmaABCFDE5020302080507060ABCFDE5020302080507060ABCFDE5020302080507060ABCFDE5020302080507060ABCFDE5020302080507060ABCFDE5020302080507060ABCFDE5020302060ABCFDE5020302060

  • Najkraa rastojanjaCILJ: Odrediti najkrae rastojanje (najkrai put) izmeu dva vora u grafuteina grane reprezentuje rastojanje izmeu dva vora - w(i,j)duina puta od vora x do vora y:

    najkrae rastojanje od vora x do vora y:

    ako vor y nije dostian iz vora x (ne postoji putanja), tada je w(x,y)=xiyjd (x,i)d (j,v)w (i,j)w (i,j)

  • Najkraa rastojanjaFLOYD-ov algoritam za najkrae rastojanje izmeu vorova u grafuulaz u algoritam: matrica teina W

    izlaz iz algoritma:matrica najkraih rastojanja D matrica prethodnika Tinicijalizacija matrice prethodnikaOsnovna ideja Floyd-ovog algoritma:Za svaki par vorova (i,j) treba provjeriti da li je put preko nekog drugog vora k kraiikjd (i,j)d (i,k)d (k,j)d(i,j)>d(i,k)+d(k,j) d(i,j)=d(i,k)+d(k,j) t(i,j)=t(k,j)

  • Najkraa rastojanjaPrimjer: Odrediti najkraa rastojanja u grafu primjenom Floyd-ovog algoritma1325238132523813252381325238Rekonstrukcija putanje: Npr. (1,2):Posljednji vor u putanji: 2vor prije vora 2: t[1][2]=3vor prije vora 3: t[1][3]=1Putanja: 132Npr. (2,1):Posljednji vor u putanji: 1vor prije vora 1: t[2][1]=2Putanja: 21Npr. (2,3):Posljednji vor u putanji: 3vor prije vora 3: t[2][3]=1vor prije vora 1: t[2][1]=2Putanja: 213

  • Najkraa rastojanja/* Floydov algoritam za min rastojanja */

    void FLOYD(){ int i,j,k; for (k=1; k