30
Pohlepne strategije za rad sa grafovima i izračunavanje nekih karakteristika grafa Traženje optimalnog rešenja može biti eksponencijalne složenosti, a pohlepni algoritam smanjujući prostor pretraživanja, smanjuje i vremensku složenost. Naime, pohlepni pristup nas u svakom trenutku usmerava na trenutno najbolje rešenje, ne uzimajući u obzir da to rešenje ne mora voditi globalnom optimumu. Zbog toga, pohlepni algoritam ne mora uvek naći optimalno rešenje, ali je znatno brži od drugih algoritama. Dodatna prednost pohlepne strategije je da, čak i kada ne pronađe optimalno rešenje, često vodi na novu strategiju razvoja algoritma koja rezultuje efikasnijim rešenjem ili tehnikom koja brzo pronalazi dobru aproksimaciju rešenja (heuristika). Heuristika koju koristi pohlepni algoritam je jednostavna: pronađi najbolje trenutno rešenje i idi za njim. Valja napomenuti da postoje mnogi algoritmi koji su zasnovani na pohlepnom pristupu, te kad se govori o pohlepnom algoritmu, ustvari govori se o kolekciji algoritama. Rešenje problema se konstruiše u nizu koraka, gde se u svakom koraku bira mogućnost koja je lokalno optimalna u nekom smislu. Ideja je da će takvi koraci dovesti do globalno optimalnog rešenja. Premda pohlepni algoritam ne mora uvek voditi globalnom optimumu, on može biti vrlo koristan u razmatranju NP- teških problema. Naime, pohlepni pristup vodi do rešenja koje sigurno predstavlja donju granicu globalnog maksimuma, ukoliko se traži maksimum, odnosno gornju granicu globalnog minimuma, ukoliko se traži minimum. Kako se pohlepni algoritam relativno brzo izvršava i daje granice optimalnog rešenja, on nam omogućava da drugim algoritmima smanjimo prostor pretrage rešenja. Postoje problemi kod kojih je dokazano da pohlepni algoritam daje optimalno rešenje. Jedan od tih problema je i problem rasporeda zadataka. Pitanje je kako rasporediti zadatke, a da prosečno vreme završavanja zadatka bude minimalno. Uopšte se može dokazati da će prosečno vreme završavanja biti najmanje ako se najpre izabere aktivnost koja se prva završava, a tada se od svih ostalih aktivnosti koje se ne preklapaju s prvom aktivnošću, izabere ona koja završava prva i taj algoritam se ponavlja (u skladu s pohlepnim algoritmom). Dokaz korektnosti algoritma se bazira na dokazivanju da je prvi izbor u algoritmu najbolji mogući i zatim treba pokazati upotrebom matematičke indukcije da je algoritam globalno optimalan. Indukcijom po broju aktivnosti, pokazuje se da pohlepni algoritam daje optimalno rešenje za problem planiranja aktivnosti. Način ovakvog dokazivanja se primenjuje za pohlepne algoritme. Ipak, valja pripaziti kada ovom problemu pristupamo pohlepnim algoritmom, jer nemaju svi zadaci koji se raspoređuju jednak prioritet. Spisak pohlepnih strategija 1. razlomljeni problem ranca Fractional Knapsack Problem 2. topološko sortiranje Topological Sort 3. Prim-ov algoritam , Prim Algorithm 4. Kruskal-ov algoritam Kruskal Algorithm 5. Dijkstr-in algoritam Dijkstra Algorithm 6. Optimalni binarni prefiksni kod Huffman Coding 7. Optimalno spajanje Optimal Merging .... Da se podsetimo Put Put od v 1 do v k je niz čvorova v 1 , v 2 , . . . ,v k povezanih granama (v 1 , v 2 ), (v 2 , v 3 ), . . . , (v k-1 , v k ) Obično se i ove grane smatraju delom puta. Put je prost, ako se svaki čvor pojavljuje u njemu samo jednom.

Pohlepne strategije za rad sa grafovima i izra unavanje ...jelenagr/2d/PohlepniGrafovi.pdfPohlepne strategije za rad sa grafovima i izra čunavanje nekih karakteristika grafa Traženje

  • Upload
    others

  • View
    1

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Pohlepne strategije za rad sa grafovima i izra unavanje ...jelenagr/2d/PohlepniGrafovi.pdfPohlepne strategije za rad sa grafovima i izra čunavanje nekih karakteristika grafa Traženje

Pohlepne strategije za rad sa grafovima i izračunavanje nekih karakteristika grafa Traženje optimalnog rešenja može biti eksponencijalne složenosti, a pohlepni algoritam smanjujući prostor pretraživanja, smanjuje i vremensku složenost. Naime, pohlepni pristup nas u svakom trenutku usmerava na trenutno najbolje rešenje, ne uzimajući u obzir da to rešenje ne mora voditi globalnom optimumu. Zbog toga, pohlepni algoritam ne mora uvek naći optimalno rešenje, ali je znatno brži od drugih algoritama. Dodatna prednost pohlepne strategije je da, čak i kada ne pronađe optimalno rešenje, često vodi na novu strategiju razvoja algoritma koja rezultuje efikasnijim rešenjem ili tehnikom koja brzo pronalazi dobru aproksimaciju rešenja (heuristika). Heuristika koju koristi pohlepni algoritam je jednostavna: pronađi najbolje trenutno rešenje i idi za njim. Valja napomenuti da postoje mnogi algoritmi koji su zasnovani na pohlepnom pristupu, te kad se govori o pohlepnom algoritmu, ustvari govori se o kolekciji algoritama. Rešenje problema se konstruiše u nizu koraka, gde se u svakom koraku bira mogućnost koja je lokalno optimalna u nekom smislu. Ideja je da će takvi koraci dovesti do globalno optimalnog rešenja. Premda pohlepni algoritam ne mora uvek voditi globalnom optimumu, on može biti vrlo koristan u razmatranju NP-teških problema. Naime, pohlepni pristup vodi do rešenja koje sigurno predstavlja donju granicu globalnog maksimuma, ukoliko se traži maksimum, odnosno gornju granicu globalnog minimuma, ukoliko se traži minimum. Kako se pohlepni algoritam relativno brzo izvršava i daje granice optimalnog rešenja, on nam omogućava da drugim algoritmima smanjimo prostor pretrage rešenja. Postoje problemi kod kojih je dokazano da pohlepni algoritam daje optimalno rešenje. Jedan od tih problema je i problem rasporeda zadataka. Pitanje je kako rasporediti zadatke, a da prosečno vreme završavanja zadatka bude minimalno. Uopšte se može dokazati da će prosečno vreme završavanja biti najmanje ako se najpre izabere aktivnost koja se prva završava, a tada se od svih ostalih aktivnosti koje se ne preklapaju s prvom aktivnošću, izabere ona koja završava prva i taj algoritam se ponavlja (u skladu s pohlepnim algoritmom). Dokaz korektnosti algoritma se bazira na dokazivanju da je prvi izbor u algoritmu najbolji mogući i zatim treba pokazati upotrebom matematičke indukcije da je algoritam globalno optimalan. Indukcijom po broju aktivnosti, pokazuje se da pohlepni algoritam daje optimalno rešenje za problem planiranja aktivnosti. Način ovakvog dokazivanja se primenjuje za pohlepne algoritme. Ipak, valja pripaziti kada ovom problemu pristupamo pohlepnim algoritmom, jer nemaju svi zadaci koji se raspoređuju jednak prioritet. Spisak pohlepnih strategija 1. razlomljeni problem ranca Fractional Knapsack Problem 2. topološko sortiranje Topological Sort 3. Prim-ov algoritam , Prim Algorithm 4. Kruskal-ov algoritam Kruskal Algorithm 5. Dijkstr-in algoritam Dijkstra Algorithm 6. Optimalni binarni prefiksni kod Huffman Coding

7. Optimalno spajanje Optimal Merging

....

Da se podsetimo

Put

Put od v1 do vk je niz čvorova v1, v2, . . . ,vk povezanih granama (v1, v2), (v2, v3), . . . , (vk-1, vk ) Obično se i ove grane smatraju delom puta. Put je prost, ako se svaki čvor pojavljuje u njemu samo jednom.

Page 2: Pohlepne strategije za rad sa grafovima i izra unavanje ...jelenagr/2d/PohlepniGrafovi.pdfPohlepne strategije za rad sa grafovima i izra čunavanje nekih karakteristika grafa Traženje

Čvor je u dostižan iz čvora v ako postoji put (usmeren/neusmeren) od v do u. Po definiciji, čvor u je dostižan iz u.

v3, e1, v1, e2, v4, e5, v2, e6, v5, e3, v1, e2, v4 ( grana e2 se pojavila dva puta)

Slika 3

1, c, 3, f, 4, e, 2, d, 3 ( čvor 3 se pojavio dva puta)

Slika 4

Ciklus

Ciklus je put čiji se prvi i poslednji čvor poklapaju. Ciklus je prost, ako, sem prvog i poslednjeg čvora se niti jedan drugi čvor ne pojavljuje u putu dva puta. Prema slici 4 ciklusi su reprezentovani nizom čvorova

• 1, 5, 4, 2, 3, 4, 1 (nije prost) • 1, 2, 3, 4, 5, 1 (prost)

Slika 4

Stablo ili drvo je povezani graf koji (u svom neusmerenom obliku) ne sadrži cikluse.

Page 3: Pohlepne strategije za rad sa grafovima i izra unavanje ...jelenagr/2d/PohlepniGrafovi.pdfPohlepne strategije za rad sa grafovima i izra čunavanje nekih karakteristika grafa Traženje

o Najkraći putevi od datog čvora do ostalih

Posmatrajmo n gradova od kojih su neki povezani putevima. Poznate su nam dužine postojećih puteva (pozitivni celi brojevi) tako da celu situaciju možemo da prikažemo težinskim grafom pri čemu je f : E→Z+. Potrebno je da odredimo najkraće puteve od jednog grada (v) do svih ostalih gradova. Efikasan algoritam kojim se rešava ovaj problem je Dijkstrin algoritam.

Često se u primeni teorije grafova treba odrediti najkraći put između dva čvora u težinskom grafu. Najčešće primene su u određivanju najkraće rute između dva grada (gde se može tražiti i put sa najmanjom potrošnjom goriva ili slično). Isto tako postoje i primene gde se traži najduži put između dva čvora – tipično kod određivanja kritičnog puta u mrežnom planiranju. Jedna od znacajnijih primena je Open Shortest Path First protokol pri IP rutiranju.

Algoritam Najkr_putevi (G,v) ulaz: G=(V,E) (tezinski usmeren graf), v (polazni cvor) izlaz: za svaki cvor w je sa w.SP oznacena tezina najkraceg puta od v do w (* uz pretpostavku da su sve tezine grana grafa nenegativne *) begin for svi cvorovi w do w.oznaka=false; w.SP=*; (* za sada tezina je beskonacna *) v.SP=0; while postoji neoznacen cvor do neka w je neoznacen cvor sa najmanjom vrednoscu w.SP w.oznaka=true; for sve grane (w,z) takve da z je neoznacen do if w.SP + tezina(w,z) < z.SP then z.SP=w.SP + tezina(w,z); end

Za svaki čvor w, u nizu w.SP odnosno d[w], pamtimo dužinu najkraćeg puta od čvora v do čvora w. Zbog potrebe za određivanje najkraćih puteva, za svaki čvor w čuvamo, u nizu p, indeks poslednjeg grada na najkraćem putu od čvora v do čvora w. Na taj način niz w, p[w], p[p[w]], …, v određuje (u obrnutom redosledu) najkraći put od čvora v do čvora w.

Pri rešavanju ovog problema skup čvorova V delimo na dva disjunktna podskupa, markirane čvorove za koje smo odredili dužinu najkraćeg puta od startnog čvora v i nemarkirane čvorove za koje tražena dužina nije izračunata. Za svaki nemarkiran čvor w, element d[w] predstavlja tekuću procenu najkraćeg puta od v do w pri čemu su svi čvorovi tog puta osim w markirani.

Page 4: Pohlepne strategije za rad sa grafovima i izra unavanje ...jelenagr/2d/PohlepniGrafovi.pdfPohlepne strategije za rad sa grafovima i izra čunavanje nekih karakteristika grafa Traženje

Na početku svi čvorovu su nemarkirani, sve elemente nizova d i p postavimo na -1 ili *, jer još nismo utvrdili ni jedan put od čvora s. Za čvor s znamo da je dužina najkraćeg puta jednaka 0, pa u skladu sa tim postavimo d[v] na 0.

U svakom koraku ovog algoritma pronađemo nemarkirani čvor u, najbliži istaknutom čvoru w (nemarkirani čvor z sa minimalnom vrednošću d[z]). Pronađeni čvor markiramo (m[z]=true). Potrebno je korigovati elemente niza d za nemarkirane čvorove. Za svaki nemarkiran čvor w element d[w] predstavlja dužinu najkraćeg puta od v do w preko markiranih čvorova, kako je sada skup markiranih čvorova proširen treba proveriti da li je put od v do w preko čvora z kraći. Zato upoređujemo veličine d[w] i d[z]+a[w,z] za sve nemakirane čvorove w koji su susedni čvoru z i po potrebi korigujemo vrednost d[w]. Pri tome ako menjamo vrednost d[w] moramo promeniti i p[w] (p[w]=z).

Ako je graf povezan algoritam se završava kada sve čvorove markiramo, inače algoritam se završava kada za svaki nemarkirani čvor w vrednost d[w] jednaka -1, tj. ne postoji put od v do w.

Uzmimo primer sa 9 gradova prikazan na slici. Prikazan je Dijkstrin algoritam nalaženja najkraćih puteva od grada sa indeksom 1. Markirani čvorovi su osenčeni, pored svakog čvora prikazana je vrednost odgovarajućeg elementa niza d. U tabeli su podebljane ivice grafa koje učestvuju u najkraćim putevima od grada 0.

SLOŽENOST za graf sa n čvorova i m grana

Ukoliko želimo da Dijkstrin algoritam radi i za nepovezane grafove, onda trebamo dodati

kontrolu u traženju sledećeg pivot čvora, da ukoliko su sve preostale evidentirane udaljenosti

beskonačne, da se izađe iz petlje.

Kompleksnost Dijkstrinog algoritama može se lako pronaći. Spoljna while petlja je reda O(n),

jer se svaki čvor tačno jednom uzima za pivota. Za svaki pivot čvor gledamo susedne čvorove

i određujemo nove udaljenosti (kroz celu glavnu petlju radimo sve skupa m puta), tako da je

kompleksnost sada O(n+m). Najveći posao je u određivanju sledećeg pivot čvora i kompleksnost zavisi od strukture podataka koju koristimo za polje udaljenosti. Ako je polje jednostavna linearna struktura, onda je traženje pivot čvora kompleksnosti O(n) i ukupna kompleksnost algoritma je O(n2). Ako je polje složenije strukture, (npr. red sa prioritetima, Fibonacci heap, gdje je kompleksnost traženja pivot čvora O(ln(n)), konačna kompleksnost algoritma je O(m+n·ln(n)).

Ako želimo kompleksnost izraziti zavosno samo o broju čvorova, moramo uzeti najteži slučaj, a

to je potpuni graf. Kompleksnost Dijkstrinog algoritama tada iznosi O(n2)

1. Dat je usmereni graf G=(V,E) sa skupom čvorova V={1,2,3,4,5,6,7,8,9} i skupom grana E sa težinama kao na slici. Odrediti težine najkraćih puteva od čvora 1 do ostalih čvorova u grafu.

Page 5: Pohlepne strategije za rad sa grafovima i izra unavanje ...jelenagr/2d/PohlepniGrafovi.pdfPohlepne strategije za rad sa grafovima i izra čunavanje nekih karakteristika grafa Traženje

REŠENJE Koristimo Dijkstrin algoritam za nalaženje težina najkraćih puteva od zadatog čvora 1 do ostalih čvorova u grafu (glava 6.5 u knjizi Algoritmika).

Prikaz postupka i rešenje je naveden u tabeli .

Najpre se popuni 1. red tabele tako da se unesu vrednosti težina grana sa slike grafa. Potom se izabere najmanja težina te vrste. Konkretno to je ovde vrednost 2 čvora 8. Potom se označi čvor 8 i formira 2. red tabele u kom se menjaju težine onih puteva koje bivaju kraće ako se u njih uključi čvor 8.

I tako redom sve dok postoji neoznačen čvor.

označeni čvor w (najmanje SP)

2 3 4 5 6 7 8 9

1 - 15 14 10 11 6 * 2 *

1,8 8 11 14 10 11 5 10 2 7

1,6,8 6 11 14 10 9 5 9 2 7

1,6,8,9 9 10 14 10 9 5 9 2 7

1,5,6,8,9 5 10 14 10 9 5 9 2 7

1,,5,6,7,8,9 7 10 14 10 9 5 9 2 7

1,2,5,6,7,8,9 2 10 12 10 9 5 9 2 7

1,2,4,5,6,7,8,9 4 10 12 10 9 5 9 2 7

1,2,3,4,5,6,7,8,9 3 10 12 10 9 5 9 2 7

Konstruisimo Dijkstra algoritam (cija je slozenost: O((V+E)log V)) koji ce nam ispisati udaljenost cvora 1 od cvora 7 (u nasem programu to ce biti udaljenost cvora 0 od cvora 6)

#include <iostream> #include <cstdio> #include <algorithm> #include <queue>

#define NMAX 100001 #define INF 1000000000

using namespace std;

int n;

Page 6: Pohlepne strategije za rad sa grafovima i izra unavanje ...jelenagr/2d/PohlepniGrafovi.pdfPohlepne strategije za rad sa grafovima i izra čunavanje nekih karakteristika grafa Traženje

struct CvorGrafa { int rastojanje; vector<int> sused; vector<int> tezina; };

CvorGrafa graf[NMAX];

bool mark[NMAX];

struct cvorRed { int cvor, rastojanje; bool operator <(const cvorRed &a) const { if (rastojanje != a.rastojanje) return (rastojanje > a.rastojanje); return (cvor > a.cvor); } };

inline void Dijkstra(int CvorPocetak) { priority_queue<cvorRed> red; cvorRed P; for (int i=0;i<n;i++) { if (i == CvorPocetak) { graf[i].rastojanje = 0; P.cvor = i; P.rastojanje = 0; red.push(P); } else graf[i].rastojanje = INF; }

while (!red.empty()) { cvorRed tekuci = red.top(); red.pop(); int tekCvor = tekuci.cvor; int tekRastojanje = tekuci.rastojanje; for (int i=0;i<graf[tekCvor].sused.size();i++) { if (!mark[graf[tekCvor].sused[i]]) { int nextNode = graf[tekCvor].sused[i]; if (tekRastojanje + graf[tekCvor].tezina[i] < graf[nextNode].rastojanje) { graf[nextNode].rastojanje = tekRastojanje + graf[tekCvor].tezina[i]; P.cvor = nextNode; P.rastojanje = graf[nextNode].rastojanje; red.push(P); } } }

Page 7: Pohlepne strategije za rad sa grafovima i izra unavanje ...jelenagr/2d/PohlepniGrafovi.pdfPohlepne strategije za rad sa grafovima i izra čunavanje nekih karakteristika grafa Traženje

mark[tekCvor] = true; }

}

int main() { n = 9;

graf[0].sused.push_back(1); graf[0].tezina.push_back(15); graf[0].sused.push_back(2); graf[0].tezina.push_back(14); graf[0].sused.push_back(3); graf[0].tezina.push_back(10); graf[0].sused.push_back(4); graf[0].tezina.push_back(5); graf[0].sused.push_back(5); graf[0].tezina.push_back(6); graf[0].sused.push_back(7); graf[0].tezina.push_back(2);

graf[1].sused.push_back(2); graf[1].tezina.push_back(2);

graf[2].sused.push_back(3); graf[2].tezina.push_back(5);

graf[3].sused.push_back(4); graf[3].tezina.push_back(1);

graf[5].sused.push_back(4); graf[5].tezina.push_back(4); graf[5].sused.push_back(6); graf[5].tezina.push_back(4);

graf[7].sused.push_back(5); graf[7].tezina.push_back(3); graf[7].sused.push_back(6); graf[7].tezina.push_back(8); graf[7].sused.push_back(8); graf[7].tezina.push_back(5);

graf[8].sused.push_back(1); graf[8].tezina.push_back(3);

Dijkstra(0); printf("%d\n",graf[6].rastojanje); return 0; }

2. Dat je usmereni graf G=(V,E) sa skupom čvorova V={1,2,3,4,5,6,7,8,9} i skupom grana E sa težinama kao na slici. Odrediti težine najkraćih puteva od čvora 1 do ostalih čvorova u grafu.

1 6 2

8 9 7

3 4 5 3 8

1 13 14 3

12

3 4 6

3

1 2

1 4

Page 8: Pohlepne strategije za rad sa grafovima i izra unavanje ...jelenagr/2d/PohlepniGrafovi.pdfPohlepne strategije za rad sa grafovima i izra čunavanje nekih karakteristika grafa Traženje

niz d niz p k Skup S

2 3 4 5 6 7 8 9 2 3 4 5 6 7 8 9

1 - 12 13 14 ¶ 3 6 4 ¶ 1 1 1 0 1 1 1 0 2 6 6 12 13 14 6 3 5 4 ¶ 1 1 1 6 1 6 1 0 3 6, 8 8 12 13 14 6 3 5 4 8 1 1 1 6 1 6 1 8 4 6, 7, 8 7 12 13 14 6 3 5 4 8 1 1 1 6 1 6 1 8 5 5, 6, 7, 8 5 12 13 14 6 3 5 4 8 1 1 1 6 1 6 1 8 6 5, 6, 7, 8, 9 9 11 13 14 6 3 5 4 8 9 1 1 6 1 6 1 8 7 2, 5, 6, 7, 8, 9 2 11 12 14 6 3 5 4 8 9 2 1 6 1 6 1 8 8 2, 3, 5, 6, 7, 8, 9 3 11 12 14 6 3 5 4 8 9 2 1 6 1 6 1 8 9 2, 3, 4, 5, 6, 7, 8, 9 4 11 12 14 6 3 5 4 8 9 2 1 6 1 6 1 8 3. Graf je zadat datotekom, dijk.in tipa text, u čijem se prvom redu nalazi jedan broj, n, koji je broj čvorova grafa, a u sledećih n redova po n brojeva. U i+1-tom redu se nalaze rastojanja od i-tog čvora do svih ostalih, tako da je to rastojanje neki broj ako postoji i 0 ako ne postoji ili ako je i=j. U poslednjem redu datoteke dat je broj čvora kraj. Ako graf modelira mrežu puteva naći niz najkraćih puteva od grada 1 do svih ostalih, zatim rekonstruiši put od grada 1 do grada kraj i štampaj njegovu dužinu. REŠENJE: (program dijkstra_algoritam;) Funkcijom unos iz datoteke dijk.in se dodeljuju vrednosti elementima matrice direktnih rastojanja i promenljivoj kraj. Dijkstra funkcija formira najkraca rastojanja. Funkcija put, ispisuju čvorovi od kraja do početka. Funkcija je mogla da se napiše kao rekurzija, U programu se pozivaju redom funkcije:

• unos; • dijkstra određuje nizove rastojanja r[i] i niz puteva t[i]; • ispis_niza ispisuje niz najkraćih rastojanja čvorova od čvora 1(r[i]); • put ispisuje unazad čvorove na najkraćem putu od 1 do kraj.

Na kraju se, u programu, ispisuje dužina najkraćeg puta od čvora 1 do čvora kraj.

program dijkstra_algoritam; ulazne promenljive d:array[1..100,1..100]of integer; r,t:array[1..100] of integer; o:array[1..100] of boolean; k,n,kraj:longint; funkcija unos; lokalne promenljive f:tekstualna datoteka i,j:integer; begin otvori datoteku 'dijk.in' za citanje, file handler neka bude f ucitaj iz datoteke f broj n; for i:=1 to n do begin for j:=1 to n do begin ucitaj iz datoteke f broj (d[i,j]); if (i<>j) and (d[i,j]=0) then d[i,j]:=maxint div 2; end; ucitaj iz datoteke f novi red end; zatvori datoteku (f); end; funkcija dijkstra; lokalne promenljive i,k,ik,min:integer;

Page 9: Pohlepne strategije za rad sa grafovima i izra unavanje ...jelenagr/2d/PohlepniGrafovi.pdfPohlepne strategije za rad sa grafovima i izra čunavanje nekih karakteristika grafa Traženje

begin o[1]:=true;t[1]:=0; for i:=2 to n do begin r[i]:=d[1,i]; if r[i]=maxint div 2 then t[i]:=0 else t[i]:=1; end; for k:=1 to n-1 do begin min:=maxint; for i:=2 to n do if (r[i] < min)and(not o[i]) then begin min:=r[i];ik:=i; end; o[ik]:=true; for i:=2 to n do if (r[i]>r[ik]+d[ik,i])and(not o[i]) then begin r[i]:=r[ik]+d[ik,i];t[i]:=ik; end; end; end; funkcija ispis_niza; lokalne promenljive f:tekstualna datoteka; i,j:integer; begin otvori datoteku 'dijk.out' za pisanje, file handler neka bude f for i:=1 to n do upisi u datoteku(f,r[i],' '); zatvori datoteku(f); end; funkcija put(i:integer); lokalne promenljive c:integer; begin c:=i; if t[c]=0 then writeln(‘nema puta’) else while c<>0 do begin write(c,'<---');c:=t[c]; end; end; GLAVNI PROGRAM unos; dijkstra; ispis_niza; put(kraj); writeln; writeln(r[kraj]); writeln; KRAJ

Page 10: Pohlepne strategije za rad sa grafovima i izra unavanje ...jelenagr/2d/PohlepniGrafovi.pdfPohlepne strategije za rad sa grafovima i izra čunavanje nekih karakteristika grafa Traženje

4. Na zabavi se nalazi n ljudi koji su numerisani brojevima od 0 do n-1. Matricom a(nxn) dato je ko se s kim poznaje, tako je a[i,j]=1 ako osoba i poznaje osobu j, inače je a[i,j]=0.Osoba s zna vest koju treba da saopšti ostalima. Osoba i može prepričati vest samo osobama koje poznaje. Svako prepričavanje traje 1 minut. Prepričavanja se mogu odvijati paralelno i svaka osoba može okupiti svoje poznanike kojima će saopštiti vest. Svaka osoba čim čuje vest odmah je prepričava, bez gubitka vremena. Napisati metod kojim se određuje minimum vremena u minutima koji je potreban da svi koji mogu čuju vest.

Problem možemo rešiti korišćenjem prethodno opisanog metoda Dijkstra kojim određujemo dužine najkraćih puteva od osobe s koja zna vest do svih ostalih osoba. Minimum vremena u minutima koji je potreban da svi koji mogu čuju vest je maksimalni član niza d.

5. Država alhemičara ima N naseljenih punktova, numerisanih od 1 do N, i M puteva. Naseljeni punktovi su dva tipa: sela i gradovi. Osim toga u državi je jedna prestonica (ona može biti u selu ili gradu). Putovanje između dva naseljena punkta (ako postoji put) traje iT minuta. Nakon odluke da se u prestonici organizuje olimpijada alhemičara u svaki

grad su upućeni kuriri sa informacijom o olimpijadi. Napišite program koji određuje u kom poretku i za koje vreme svaki od kurira stiže do svog grada. Pretpostavlja se da se kuriri u toku puta nigde ne zadržavaju. U prvoj liniji ulaznog fajla su zapisana 3 broja: N – broj naseljenih punktova ( 10002 ≤≤ N ), M – broj puteva ( 100001 ≤≤ M ) i K – broj gradova ( NK ≤≤1 ). Dalje je zapisan broj prestonice C ( NC ≤≤1 ). U sledećem redu su K brojeva gradova. Dalje sledi M trojki brojeva iii TES ,, , gde su ii ES , brojevi naseljenih punktova koje povezuje

put, a iT – trajanje putovanja tim putem ( 1001 ≤≤ iT ). Garantuje se da se iz prestonice može stići do svakog grada.

test.txt izlaz.txt 5 4 5 1 1 2 3 4 5 1 2 1 2 3 10 3 4 100 4 5 100

1 0 2 1 3 11 4 111 5 211

5 5 3 1 2 4 5 2 1 1 2 3 10 3 4 100 4 5 100 1 5 1

5 1 2 1 4 101

Napomena. Alhemija je disciplina koja kombinuje elemente mnogih nauka i filozofskih disciplina, poput hemije, metalurgije, fizike, medicine, astrologije, misticizma i umetnosti. Rešenje. Za svako naselje korišćenjem Dijkstrinog algoritma nađemo najmanje vreme, za koje kurir do njega stiže. Nakon toga ispisati naselja koja su gradovi sortirane po vremenu u neopadajućem poretku.

#include <iostream> #include <climits> // Zbog INT_MAX #include <fstream> const int maxN=150; // Maksimalni broj cvorova u grafu const int max=INT_MAX/2; int n,m,k,c; // Startni cvor int a[maxN][maxN], d[maxN], pos[maxN]; bool mark[maxN],grad[maxN]; // medju nemarkiranim cvorovima nalazi najblizi startnom cvoru s. // tj. cvor j za koji je d[j] minimalno int ExtractMin(bool mark[], int d[], int n) { int minD=max;

Page 11: Pohlepne strategije za rad sa grafovima i izra unavanje ...jelenagr/2d/PohlepniGrafovi.pdfPohlepne strategije za rad sa grafovima i izra čunavanje nekih karakteristika grafa Traženje

int i,j=-1; for (i=1; i<=n; i++) if (!mark[i] && d[i]<minD){minD=d[i];j=i;} return j; } void Dijkstra(int s) { int i, j, k; for (i=1; i<=n; i++) // Inicijalizacija: d[i]=a[s][i] { d[i]=a[s][i]; mark[i]=false;//mark[i]=false oznacava pripadnost cvora skupu T } d[s]=0; // Rastojanje od s do s je 0 mark[s]=true; // Cvor s ulazi u skup S - postojana rastojanja // Ciklus se prekida ako ne postoji cvor i iz T takav da je: d[i]<MAX. for (k=1; k<=n-1; k++) // Postoji n-1 kandidata za S {// Izbor nemarkiranog cvora j (iz T), cije je d[j] minimalno j=ExtractMin(mark,d,n); if (j==-1)break;// Medju nemarkiranim cvorovima, // nema dostiznih iz s:d[i]=max (nedostizan)- izlaz mark[j]=true; // Cvor j ulazi u skup postojanih cvorova S // Za sve cvorove koji su u T poboljsava se ocena, ako je moguce: // d[i]=min(d[i],d[j]+a[j][i]) for (i=1; i<=n; i++) if (!mark[i]) if (d[i]>d[j]+a[j][i])d[i]=d[j]+a[j][i]; } } int main() {int g, s, e, t, i, j; bool temp; ifstream f("test.txt"); f >> n >> m >> k >> c; for (i=1; i<=n; i++) {grad[i]=false;pos[i]=i;} for (i=1; i<=k; i++) {f >> g; grad[g]=true; } for (i=1; i<=n; i++) for (j=1; j<=m; j++) if (i==j) a[i][j]=0; else a[i][j]=max; for (i=1; i<=m; i++) { f >> s >> e >> t; a[s][e]=t; a[e][s]=t; } Dijkstra(c); // sortira niz d[] tako sto razmenu prate grad[] i pos[] for (i=1; i<=n-1; i++) for (j=i+1; j<=n; j++) if (d[i]>d[j]) {t=d[i]; d[i]=d[j]; d[j]=t;

Page 12: Pohlepne strategije za rad sa grafovima i izra unavanje ...jelenagr/2d/PohlepniGrafovi.pdfPohlepne strategije za rad sa grafovima i izra čunavanje nekih karakteristika grafa Traženje

temp=grad[i]; grad[i]=grad[j]; grad[j]=temp; t=pos[i]; pos[i]=pos[j]; pos[j]=t;} for (i=1; i<=n; i++) if (grad[i]) cout << pos[i] << ' ' << d[i]<< endl; return 0; }

o Najkraći putevi između svih parova čvorova

Proširimo prethodno opisani problem nalaženjem najkraćih puteva između svaka dva grada. Opštije, za dati orijentisani graf G=(V,E) sa nenegativnim težinama grana odrediti najkraće puteve između svih parova čvorova.

Najpoznatiji algoritam koji rešava ovaj problem je Flojd-Varšalov algoritam čiji opis sledi.

Algoritam SviNajkraciPutevi (W)

{ for (m=0; m<|V|; m++) for(x=0; x<|V|; x++) for(y=0;y<|V|; y++)

if ( W[x,m] +W[m,y] <W[x,y]) W[x,y]= W[x,m] +W[m,y] ; /*nadjen je kraci put od x do y od predjasnje postavljene duzine*/ } Jednostavno možemo pokazati, da ako je k čvor najkraćeg puta od čvora u do čvora v onda je deo puta od u do k i deo puta od k do v takođe najkraći. Problem rešavamo tehnikom dinamičkog programiranja. Polazimo od direktnih puteva između čvorova, zatim za svaki par čvorova posmatramo put na kome je uključen čvor 0. U sledećem koraku korigujemo puteve dodavajući i čvor 1, tako da posmatramo puteve u kojima su uključeni čvorovi {0, 1}, itd. dok ne dodamo sve čvorove.

Označimo sa d(k)[u,v] dužinu najkraćeg puta između čvorova u i v, tako da su svi čvorovi tog puta, osim krajnjih, iz skupa {0, 1, …, k}.Direktne veze između čvorova, date matricom susedstva, označimo sa d(-1)[u,v]. Matrice d(k) određujemo redom za k=0, 1, ..., n-1. Prilikom određivanja d(k)[u,v]treba proveriti da li dodavanjem čvora k na putu između čvorova u i v dobijamo kraći put. Upoređujemo vrednosti d(k-1)[u,v]i d(k-1)[u,k]+ d(k-1)[k,v], manju od njih dodeljujemo elementu d(k)[u,v] tj. d(k)[u,v]=min(d(k-1)[u,v],d(k-1)[u,k]+ d(k-1)[k,v]).

Potrebno je odrediti i najkraći put pa zato formiramo matricu p, tako da je p[u,v] indeks prethodnog čvora čvoru v na putu od u do v ako put postoji, inače p[u,v]je jednako -1. Prilikom ispisa puta od čvora u do čvora v ispišemo prvo put od u do p[u,v] a zatim granu (p[u,v],v).

6. Granama grafa G=( {1,2,3,4}, E) su pridružene težine kao u tabeli:

grana težina

(1,2) 2

(1,3) 8

(2,3) 3

(2,4) 4

Page 13: Pohlepne strategije za rad sa grafovima i izra unavanje ...jelenagr/2d/PohlepniGrafovi.pdfPohlepne strategije za rad sa grafovima i izra čunavanje nekih karakteristika grafa Traženje

(3,4) 7

(4,1) 5

Odrediti sve najkraće puteve (all shortest paths) između čvorova ovog grafa.

REŠENJE: Matrica Wi se formira prema algoritmu izloženom i knjizi u odeljku 6.7

Algoritam SviNajkraciPutevi (W)

{ for (m=0; m<|V|; m++) for(x=0; x<|V|; x++) for(y=0;y<|V|; y++)

if ( W[x,m] +W[m,y] <W[x,y]) W[x,y]= W[x,m] +W[m,y] ; /*nadjen je kraci put od x do y od predjasnje postavljene duzine*/ }

W 0 1 2 3 4

1 0 2 8 beskonačno

2 beskonačno 0 3 4

3 beskonačno beskonačno 0 7

4 5 beskonačno beskonačno 0

W 1 1 2 3 4

1 0 2 8 beskonačno

2 beskonačno 0 3 4

3 beskonačno beskonačno 0 7

4 5 7 13 0

7=5+2 13=5+8

W 2 1 2 3 4

1 0 2 5 6

2 beskonačno 0 3 4

3 beskonačno beskonačno 0 7

4 5 7 10 0

5=2+3 6=2+4 10=7+3

W 3 1 2 3 4

1 0 2 5 6

Page 14: Pohlepne strategije za rad sa grafovima i izra unavanje ...jelenagr/2d/PohlepniGrafovi.pdfPohlepne strategije za rad sa grafovima i izra čunavanje nekih karakteristika grafa Traženje

2 beskonačno 0 3 4

3 beskonačno beskonačno 0 7

4 5 7 10 0

W 4 1 2 3 4

1 0 2 5 6

2 9 0 3 4

3 12 14 0 7

4 5 7 10 0

9=4+5 12=7+5 14=7+7

7. Zadat je težinski graf iz prethodnog zadatka sa nenegativnim težinama grana. Naći središte grafa.

REŠENJE:Središte grafa je čvor v takav da ima najamanju ekscentričnost. Ekscentričnost čvora v je maksimum najkraćih rastojanja od svih čvorova grafa G do čvora v, tj. ecc(v) = max { W[ i, v] | za svaki čvor i }

Koraci:

1. primenom algoritma Svi_najkraci_putevi se nadje matrica W najkracih rastojanja izmedju svih parova cvorova

2. nadju se maksimumi po kolonama matrice W 3. nadje se vrednost minimuma ovih maksimuma i proglasiti za srediste grafa onaj cvor kojem

odgovara ta vrednost

U konkretnom slučaju grafa iz prethodnog zadatka je pronadjena matrica W u četvrtoj iteraciji:

W 4 = W 1 2 3 4

1 0 2 5 6

2 9 0 3 4

3 12 14 0 7

4 5 7 10 0

Maksimumi po kolonama su:

• ecc(1) = 12 • ecc(2) = 14 • ecc(3) = 10 • ecc(4) = 7

Page 15: Pohlepne strategije za rad sa grafovima i izra unavanje ...jelenagr/2d/PohlepniGrafovi.pdfPohlepne strategije za rad sa grafovima i izra čunavanje nekih karakteristika grafa Traženje

Odavde se zaključuje da središte grafa je čvor 4, zato što on ima najmanju ekscentričnost (čija vrednost jeste 7).

8. Zadat je težinski graf G=(V,E) sa nenegativnim težinama grana. Za zadata dva čvora i,j skupa V pronaći put minimalne dužine (a ne samo težinu tog puta).

REŠENJE:

BSO, indeksiramo vrste i kolone od 1..n umesto od 0 do n-1. Izmena algoritma Svi_Najkr_putevi (glava 6.7 knjige) , tako da se formira matrica prethodnika P gde element P[i,j] pamti čvor koji je neposredni prethodnik čvora j na najkraćem putu od čvora i.

Jasno je da: 1. P[i,j]=0 ako je i==j ili ako W[i,j]=beskonacno 2. P[i,j]=i ako i !=j i ako w[i,j] < beskonacno

Dakle, najpre se algortmom Svi_najkraci_putevi u tri for ciklusa ažurira polazna matrica težina W, tako da na kraju čuva samo najkraće težine (rastojanja) između dva čvora. Tokom ažuriranja matrice W, vrši se i formiranje matrice čvorova P, tako što:

ako je u k iteracija spoljašnjeg for ciklusa od svih puteva medju čvorovima i,j koji prolaze kroz međučvorove 1,2,..k nađen trenutno najkraći put, onda:

1. ako se čvor k ne nalazi na tom putu, onda su svi medjučvorovi iz skupa {1,2,..,k-1}, pa je to ista ocena najkraćeg puta dobijena iz prethodne (k-1).ve iteracije sa istim prethodnikom P[i,j]

2. ako se čvor k nalazi na tom putu od i do j, onda ovaj put može da se podeli na puteve od i do k, i na put od k do j. Put izmedju čvorova i, k prolazi kroz medjučvorove 1..k-1 i on je deo najkraćeg puta od i do j u k-toj iteraciji, pa je kao u dokazu sa predavanja to i najkraci put od i do k. Slično se pookazuje da je put od k do j najkraći put od k do j koji prolazi kroz čvorove 1..k-1. Dakle, kako je drugi segment puta zajednički, onda prethodnik u k-toj iteraciji P[i,j] čvora j na najkracem putu je istovetan kao i prethodnik P[k,j] iz (k-1)-ve iteracije Prema tome, najkraći put od čvora i do čvora j kroz čvorove 1..k se dobija kao manji od najkraćeg puta između i,j kroz medjučvorove 1,..., k-1 i zbira najkraćeg puta između čvorova i,k i puta izmedju k,j kroz čvorove 1..k-1 sto i jeste u jezgru najugnjezdenijeg for ciklusa.

Potom se od dobijene matrice P rekonstruiše najkraći put u proceduri putanja.

Algoritam Svi_najkraci_putevi (W) Ulaz:W(matrica tezina) Izlaz: W(matrica duzina najkracih puteva), P(matrica prethodecih cvorova na najkracim putevima) { for (k=1; k<=n; k++) for (i=1; i<=n; i++) for (j=1; j<=n; j++) if ( W[i,j]>W[i,k]+W[k,j] ) { P[i,j]=P[k,j]; W[i,j]=W[i,k] + W[k,j] } } /*iz matrice P rekonstruisemo najkraci put izmedju dva zadata cvora i,j */ Algoritam PUTANJA(i,j) { if (i==j) stampati (i); /*povratak*/

Page 16: Pohlepne strategije za rad sa grafovima i izra unavanje ...jelenagr/2d/PohlepniGrafovi.pdfPohlepne strategije za rad sa grafovima i izra čunavanje nekih karakteristika grafa Traženje

else if (P[i,j]==0) stampati "(Nema puta izmedju i, j)"; else {PUTANJA(i, P[i,j] ); stampati (j); } }

Dakle, neka rezultujuća matrica puteva P izgleda:

0 1 2 2

4 0 2 2

4 4 0 3

4 1 2 0

Tad je: prvi poziv npr. Putanja (1,4) kako P[1,4] !=0, drugi poziv je Putanja (1,2), jer P[1,4]=2 kako P[1,2] !=0, drugi poziv je Putanja (1,1), jer P[1,2]=1 kako 1==1, stampa se 1 dalje, štampa se 2 dalje, štampa se 4 DAKLE, najkraći put izmedju čvorova 1 i 4 jeste dužine 6 (po zadatku 1), a ima putanju (((1),2),4)

9. Orijentisani težinski graf je dat matricom veze. Formirati matricu najkraćih puteva između njenih čvorova. Ulaz. U prvom redu se unosi N (1 <= N <= 100) – broj čvorova. U sledećih N redova po N brojeva zadaje matricu veze grafa (j-ti broj u i-tom redu odgovara težini ivice iz čvora i u čvor j). Na glavnoj dijagonali su nule. Izlaz. Matrica NxN – najkraćih rastojanja među parovima čvorova.

Page 17: Pohlepne strategije za rad sa grafovima i izra unavanje ...jelenagr/2d/PohlepniGrafovi.pdfPohlepne strategije za rad sa grafovima i izra čunavanje nekih karakteristika grafa Traženje

Ulaz 4

0 5 9 100

100 0 2 8

100 100 0 7 4 100 100 0

Izlaz 0 5 7 13

12 0 2 8

11 16 0 7

4 9 11 0

10. Dat je graf na slici, odrediti sve iteracije kojima se dolazi do matrica najkraćih rastojanja i matrice za rekonstrukciju puta.

Matrica )(kd Matrica )(k

t

0=k

∞∞

∞∞

∞∞

06

20

50

9810

0040

3000

0200

1110

1=k

∞∞

∞∞

∞∞

06

20

50

9810

0040

3000

0200

1110

2=k

∞∞

∞∞

0116

20

50

9610

0240

3000

0200

1210

3=k

∞∞

0116

20

750

8610

0240

3000

3200

3210

4=k

0116

208

750

8610

0240

3040

3200

3210

REŠENJE: Matrica, d najkraćih rastojanja početnu vrednost dobija od matrice direktnih puteva, u proceduri unos pre nego što se pozove procedura Flojd i matrica t za rekonstrukciju puta dobija vrednosti u proceduri unos (k=0). U prvoj iteraciji Flojdovog algoritma (k=1) ne skraćuju se putevi preko čvora 1, druga iteracija(k=2) skraćuje puteve, preko čvora 2, od 1 do 3 i od 4 do 3, treća (k=3) skraćuje puteve, preko čvora 3, od 1 do 4 i od 2 do 4, četvrta iteracija(k=4), preko čvora 4, skraćuje put od 3 do 2.

2

1

3

4

5

1 2

6

8

9

Page 18: Pohlepne strategije za rad sa grafovima i izra unavanje ...jelenagr/2d/PohlepniGrafovi.pdfPohlepne strategije za rad sa grafovima i izra čunavanje nekih karakteristika grafa Traženje

10. Matricom rod date su roditeljske veze između n osoba numerisanih brojevima od 0 do n-1, tako da je rod[i,j]=true ako je osoba i roditelj osobi j, inače je rod[i,j]=false. Kreirati metod kojim se formira matrica p tako da je p[i,j]=true ako je osoba i predak osobi j , inače je p[i,j]=false.

Resenje:

Informacije o roditeljstvu možemo predstaviti grafom G=(V,E)tako da je V={0, 1, ..., n-1}, E={ (i,j) |rod[i,j]=true 0≤i,j<n }(postoji ivica od čvora i do čvora j samo ako je rod[i,j]=true). Definisanjem grafa G problem nalaženja matrice p svodi se na nalaženje puteva između svih parova čvorova u grafu G jer je osoba i predak osobi j samo ako postoji put u grafu G od čvora i do čvora j. Korišćenjem Flojd-Varšalovog algoritma najefikasnije rešavamo postavljeni problem.

11. Ako je nad skupom{0, 1, ..., n-1} zadata binarna relacija α matricom A(nxn) tako da je A[i,j]=true ako su i i j u relaciji inače je A[i,j]=false odrediti relaciju β koja predstavlja minimalnu dopunu relacije α do relacije ekvivalencije. Relacija β je minimalna dopuna relacije α do relacije ekvivalencije ako je relacija β relacija ekvivalencije i ako je α⊆β i za svaku relaciju ekvivalencije β1 gde je α⊆β1 važi β⊆β1.

Resenje:

Binarna relacija indukuje graf G čiji je skup čvorova {0, 1, ..., n-1} a ivica (u,v) postoji u grafu samo ako su elementi u i v u relaciji (A[u,v]=true).

Relaciju treba dopuniti tako da bude refleksivna, simetrična i tranzitivna. Refleksivnost se obezbeđuje dodavanjem za svako u od 0 do n-1 ivice (u,u), simetrija tako što za svaku ivicu (u,v) dodamo i ivicu (v,u). Minimalnim tranzitivnim zatvorenjem elementi u i v biće u relaciji β akko postoji put od čvora u do čvora v u grafu G, što realizujemo nalaženjem najkraćih puteva između svih parova čvorova, Flojd-Varšalovim algoritmom.

o Minimalno drvo razapinjanja Posmatrajmo skup od n računara koje treba povezati optičkim kablovima. Poznata je

cena povezivanja za svaka dva računara. Povezivanje treba izvršiti tako da ukupna cena bude minimalna. Taj problem je u teoriji grafova poznat kao problem formiranja minimalnog drveta razapinjanja.

Stablo koje dobijamo uklanjanjem određenog broja grana grafa, a da pritom dobijeni graf ostane povezan, zovemo razapinjajuće ili obuhvatno stablo (spanning tree). Generalno, konstruisanje razapinjajućeg stabla jednostavan je postupak, ali je često u primenama poželjno da takvo razapinjajuće stablo ima i neka dodatna svojstva, kao što je minimalna/maksimalna suma težina grana. Obuhvatna stabla se generišu algoritmima za obilazak grafa po širini ili dubini. Za isti graf može postojati više obuhvatnih stabala. Minimalno obuhvatno stablo ima najmanju cenu (suma cena grana). Može biti više takvih stabala (ista cena).

Neka je G=(V,E) povezan neorijentisan graf i neka je d : E→ R+ funkcija kojom su

definisane dužine ivica. Minimalno drvo razapinjanja grafa G je podgraf T=(V, ET) gde je ET⊆E takav da važi:

o T je drvo (povezan graf bez ciklusa)

o zbir dužina ivica skupa ET je minimalan.

Prikazujemo Primov algoritam za određivanje minimalnog drveta razapinjanja.

Page 19: Pohlepne strategije za rad sa grafovima i izra unavanje ...jelenagr/2d/PohlepniGrafovi.pdfPohlepne strategije za rad sa grafovima i izra čunavanje nekih karakteristika grafa Traženje

Drvo kreiramo tako što polazimo od proizvoljnog čvora (npr.0) pa dodajemo čvor po čvor, dok ne dodamo sve čvorove grafa. Razlikujemo skup U čvorova koje smo dodali u drvo i skup V\U čvorova koje još nismo dodali u drvo. Na početku je U={0} i ET={}. U svakoj iteraciji algoritma izaberemo granu (u,v) sa minimalnom dužinom takvu da je u∈U i v∈V\U, tj. biramo granu koja je najbliža kreiranom drvetu. Skup čvorova U proširimo za čvor v, U=U∪{v}, a granu (u,v) dodamo u skup ivica traženog drveta ET= ET∪{(u,v)}. Postupak ponavljamo dok ne postane U=V.

Pri realizaciji ovog algoritma, slično kao kod Dijkstrinog algoritma, koristimo

• niz mark kojim definišemo da li je čvor uključen u drvo ili nije

• niz d kojim pamtimo za svaki čvor v∈V\U (mark[v]=false) najmanju dužinu ivice koja spaja čvor v sa nekim čvorom u iz drveta (mark[v]=true)

• niz p kojim pamtimo za svaki čvor v∈V\U indeks njemu najbližeg čvora iz kreiranog drveta.

Rezultat algoritma, minimalno drvo razapinjanja definišemo granama koje čine to drvo. Početke grana pamtimo nizom e1 a krajeve nizom e2.

Prim-ov algoritam: PRIM(G, s) U = {s} E' = ∅ while (U ≠ V) do find (u, v) ⇒ min {w(u, v) : (u ∈ U) and (v ∈ (V- U)) } U = U + {v} E' = E' + {(u, v)} end_while MCST = (U, E') Kruskal-ov algoritam 1. Inicijalno, graf se posmatra kao potpuno nepovezan (nepovezane komponente) 2. Skup grana E se uređuje po neopadajućoj težini (prioritetan red) 3. Nova grana se dodaje samo ako spaja dve odvojene komponente (T) Kompleksnost Kruskalovog algoritama je O(m·log(n)), tj. vremenska slozenost je O(E log V) KRUSKAL(G) E' = ∅ for each (u, v) ∈ E do PQ-INSERT(PQ, w(u, v)) end_for num = 0 while (num < n - 1) do w(u,v) = PQ-MIN-DELETE(PQ) if ((u ∈ Ti) and (v ∈ Tj) and (i ≠ j)) then E' = E' + {(u, v)} Tk = Ti + Tj num = num + 1 end_if end_while MCST = (V, E')

SLOZENOST:

Koristeći binarni heap, Prim-Jarnikov algoritam je kompleksnosti O((m+n) ·log(n)) tj. slozenost je O((V+E)log V), a koristeći Fibonacci heap, kompleksnost algoritma je O(m+n·log(n)). Sa potpunim grafom, u prvom slučaju kompleksnost je O(n2·log(n)), a u drugom O(n2).

12. Za dati graf na slici, konstruišite razapinjuće stablo minimalne cene (MCST) upotrebom Prim-ovog i Kruskal-ovog algoritma.

Page 20: Pohlepne strategije za rad sa grafovima i izra unavanje ...jelenagr/2d/PohlepniGrafovi.pdfPohlepne strategije za rad sa grafovima i izra čunavanje nekih karakteristika grafa Traženje

Rešenje: PRIMov algoritam: Čvor A je odabran za koren stabla

A-B A-B, B-H A-B, B-H, H-C A-B, B-H, H-C, C-D A-B, B-H, H-C, C-D, C-F Cena MCST-a je 8+3+6+12+14=43 Prim-ov algoritam: PRIM(G, s) U = {s} E' = ∅ while (U ≠ V) do find (u, v) ⇒ min {w(u, v) : (u ∈ U) and (v ∈ (V- U)) } U = U + {v} E' = E' + {(u, v)} end_while MCST = (U, E') Kruskal-ov algoritam 1. Inicijalno, graf se posmatra kao potpuno nepovezan (nepovezane komponente) 2. Skup grana E se uređuje po neopadajućoj težini (prioritetan red) 3. Nova grana se dodaje samo ako spaja dve odvojene komponente (T) Kompleksnost Kruskalovog algoritama je O(m·ln(n)). KRUSKAL(G) E' = ∅ for each (u, v) ∈ E do

Page 21: Pohlepne strategije za rad sa grafovima i izra unavanje ...jelenagr/2d/PohlepniGrafovi.pdfPohlepne strategije za rad sa grafovima i izra čunavanje nekih karakteristika grafa Traženje

PQ-INSERT(PQ, w(u, v)) end_for num = 0 while (num < n - 1) do w(u,v) = PQ-MIN-DELETE(PQ) if ((u ∈ Ti) and (v ∈ Tj) and (i ≠ j)) then E' = E' + {(u, v)} Tk = Ti + Tj num = num + 1 end_if end_while MCST = (V, E') Sortirane grane {BH=3, CH=6, AB=8, CD=12, DH=13, CF=14, BC=18, AF=19, BF=34} a) Od korena stabla mora da polazi grana najmanje težine. Ovde se bira čvor H. b) H-B H-B, H-C H-B, H-C, B-A H-B, H-C, B-A, C-D H-B, H-C, B-A, C-D, C-F c)

Poredjenje tri algoritma za konstrukciju MCST Osnovne razlike između tri algoritama su: • Prim-Jarnikov algoritam u svakom koraku proširuje označeno stablo sa najbližim čvorom, • Kruskalov algoritam u svakom koraku spaja dva najbliža stabla sa novom granom, • Borůvkin algoritam u svakom koraku spaja sva najbliža stabla sa novom granom. Kruskalov i Borůvkin algoritam se mogu unaprediti tako da njihova kompleksnost bude O(m·α(n)), gdje je α inverzna Ackermanova funkcija. 13. Za dati graf na slici, konstruišite razapinjuće stablo minimalne cene (MCST) upotrebom Prim-ovog i Kruskal-ovog algoritma.

Rešenje:

Page 22: Pohlepne strategije za rad sa grafovima i izra unavanje ...jelenagr/2d/PohlepniGrafovi.pdfPohlepne strategije za rad sa grafovima i izra čunavanje nekih karakteristika grafa Traženje

Obuhvatno stablo

Prim-ov algoritam A-B, B-G, B-E, E-C, C-F, E-I, I-H, F-D Kruskal-ov algoritam A-B, B-G, C-F, E-C, B-E, E-I, I-H, F-D

14. U zemlji S, postoji n jezera (numerisanih od 1 do n) i m kanala između njih. Poznata je širina svakog kanala (u metrima). Kretanje kanalima se može izvesti u oba smera. Poznato je da čamac širine jedan metar može dospeti do ma kog jezera, počevši od jezera sa rednim brojem 1.

Napisati program koji izračunava minimalni broj kanala koje treba proširiti, tako da čamac širine k metara može putovati između svaka dva jezera (čamac se može kretati od jednog jezera do drugog, ako je njegova širina manja ili jednaka od širine kanala koji povezuje jezera).

Ulaz U prvoj liniji standardnog ulaza su dati celi brojevi n i m (1 < n ≤ 1000, 1 < m ≤ 100000). U narednih m linija su data tri cela broja, i, j i w, koji ukazuju da postoji kanal širine w (1 ≤ w ≤ 200) između

jezera, i i j (1 ≤ i, j ≤ n). U poslednjoj liniji je dat ceo broj k (1 ≤ k ≤ 200).

Izlaz U jedinom redu standardnog izlaza ispišite jedan ceo broj: minimalni broj kanala koji treba proširiti.

Primer

Ulaz 6 9

1 6 1

1 2 2

1 4 3

2 3 3

2 5 2

3 4 4

3 6 2

4 5 5

5 6 4

4

Izlaz 2

Rešenje;

1 način

Nađimo maksimalno obuhvatno stablo Tmax grafa jezera G i povežimo ga kanalima. Posle izračunavamo koliko (grana) kanala iz Tmax su uži od date vrednosti K. Neka je broj takvih kanala q. Ako se ovi kanali prošire, čamac širine K može da prođe između svaka dva jezera. Štaviše, ako uklonimo sve kanale uže od K, graf će se razbiti na q+1 komponenti povezanosti i minimalni broj kanala koji će povezati sve komponente jeste q.

2 način

Page 23: Pohlepne strategije za rad sa grafovima i izra unavanje ...jelenagr/2d/PohlepniGrafovi.pdfPohlepne strategije za rad sa grafovima i izra čunavanje nekih karakteristika grafa Traženje

Tražimo broj komponenti povezanosti grafa jezera GK i kanala širine barem K. Neka je taj broj q+1. Pošto je grad G povezan, postojaće q tesnih kanala, koji će pri proširivanju do širina K i

dodavanjem u GK povezati komponente. Pronalaženje komponenti povezanosti u GK može da se obavi nekim algoritmom za obilazak grafa – BFS ili DFS. #include <algorithm> #include <cstdio> #include <map> #include <vector> #include <queue> #include <limits.h> using namespace std; const int MaxVertex=1001; int E[MaxVertex][MaxVertex], D[MaxVertex], Pi[MaxVertex]; bool Marked[MaxVertex]; int N,M,K; void input() { int u,v,w; scanf("%d %d", &N, &M); for(int i=1; i<=N; i++) for (int j=1; j<=N; j++) E[i][j]=0; for(int i=1; i<=M; i++) { scanf("%d %d %d", &u, &v, &w); E[u][v]=w; E[v][u]=w; } scanf("%d", &K); } void CreateMST(int s) { int u,v,w,cnt; for(int i=1; i<=N; i++) { D[i]=0; Pi[i]=-1; Marked[i]=false; } D[s]=INT_MAX; // niz D čuva težine grana u MaxSpaningTree !! // niz Pi čuva prethodnike čvorova cnt=1; // koliko cvorova je u T, koren s je u stablu T while (cnt<=N) { w=0; u=0; for(int i=1; i<=N; i++) if ((D[i]>w) && (!Marked[i])) {w=D[i]; u=i;} Marked[u]=true; // if (u != s) printf("%d %d %d\n",u, Pi[u], D[u]); for(int v=1; v<=N; v++) if ((D[v]<E[u][v]) && (!Marked[v])) {D[v]=E[u][v]; Pi[v]=u;} cnt++; } // uredjeni par <v,Pi(v)> je u T, sa tezinom d[v], za v != s }

Page 24: Pohlepne strategije za rad sa grafovima i izra unavanje ...jelenagr/2d/PohlepniGrafovi.pdfPohlepne strategije za rad sa grafovima i izra čunavanje nekih karakteristika grafa Traženje

void SolveP2() { int l; l=0; for (int v=1; v<=N; v++) if ((Pi[v]>0) && (D[v]<K)) l++; // printf("Kratki_kanali = %d\n",l); printf("%d\n",l); } main() { input(); CreateMST(1); SolveP2(); }

15. U zemlji S, postoji N jezera (numerisanih od 1 do n) i M kanala između njih. Poznata je širina svakog kanala (u metrima). Kretanje kanalima se može izvesti u oba smera.

Transportno preduzeće Jezero je pripremilo listu od K parova jezera između kojih će se obavljati redovni transport robe i ljudi putem čamaca.

Napišite program koji izračunava maksimalnu širinu čamaca, koji mogu proći između parova jezera koji se nalaze na listi jezera (čamac se može kretati od jednog jezera do drugog, ako je njegova širina manja ili jednaka od širine kanala koji povezuje jezera).

Ulaz U prvoj liniji standardnog ulaza su dati celi brojevi N, M, K (N ≤ 1000, M ≤ 100000, K ≤ 10000). U narednih m linija su data tri cela broja, i, j i w, koji ukazuju da postoji kanal širine w između jezera, i i j

(1 ≤ i, j ≤ N, Wi,j ≤ 200). Potom sledi K linija, tako da svaka sadrži brojeve dva jezera i, j, između kojih se obavlja transport ljudi i robe.

Izlaz Program treba da ispiše K redova na standardnom izlazu, od kojih svaki sadrži jedan ceo broj, jednak

maksimalnoj širini čamca, koji može putovati između odgovarajuća dva jezera.

Primer

Ulaz 6 9 4

1 2 2

1 4 3

1 6 1

2 3 3

2 5 2

3 4 4

3 6 2

4 5 5

5 6 4

2 6

3 5

1 2

4 6

Izlaz 3

4

3

4

Page 25: Pohlepne strategije za rad sa grafovima i izra unavanje ...jelenagr/2d/PohlepniGrafovi.pdfPohlepne strategije za rad sa grafovima i izra čunavanje nekih karakteristika grafa Traženje

Rešenje: Pronađimo maksimalno obuhvatno stablo T grafa jezera G i povežimo ga kanalima. Sve grane ovog stabla su

grane sa najvećim težinama u G, odnosno najširi kanali među čvorovima grafa G. Prim-ovim algoritmom se može generisati ovo stablo. Možemo ovo stablo predstaviti kao koreno stablo tako da niz D čuva i reguliše širinu kanala (iz stabla) dok niz Pi čuva prethodnike čvorova. Uz malo analize obilaska stabla možemo izračunati na kom nivou u odnosu na koren je svaki čvor (vrednosti niza Depth). Maksimalno obuhvatno stablo koje je predstavljen na takav način omogućuje da se u vremenu O(p) (gde p jе dužina puta) izračuna širina puta između svakog para čvorova u datoj listi sa K čvorova. #include <algorithm> #include <cstdio> #include <map> #include <vector> #include <queue> #include <time.h> #include <limits.h> using namespace std; const int MaxVertex=1001, MaxPairs=10001; int E[MaxVertex][MaxVertex], Pairs[MaxPairs][2], D[MaxVertex], Pi[MaxVertex], Depth[MaxVertex]; bool Marked[MaxVertex]; int N,M,K,w; void input() { int u,v,w; scanf("%d %d %d", &N, &M, &K); for(int i=1; i<=N; i++) for (int j=1; j<=N; j++) E[i][j]=0; for(int i=1; i<=M; i++) { scanf("%d %d %d", &u, &v, &w); E[u][v]=w; E[v][u]=w; } for(int i=1; i<=K; i++) scanf("%d %d\n",&Pairs[i][1],&Pairs[i][2]); } void CreateMST(int s) { int u,v,w,cnt; for(int i=1; i<=N; i++) { D[i]=0; Pi[i]=-1; Marked[i]=false; Depth[i]=0;} D[s]=INT_MAX; // MaxSpaningTree !! cnt=1; // broj cvorova u T (koren je s) while (cnt<=N) { w=0; u=0; for(int i=1; i<=N; i++) if ((D[i]>w) && (!Marked[i])) {w=D[i]; u=i;} Marked[u]=true; // if (u != s) printf("%d %d %d %d\n",u, Pi[u], D[u], Depth[u]); for(int v=1; v<=N; v++) if ((D[v]<E[u][v]) && (!Marked[v]))

Page 26: Pohlepne strategije za rad sa grafovima i izra unavanje ...jelenagr/2d/PohlepniGrafovi.pdfPohlepne strategije za rad sa grafovima i izra čunavanje nekih karakteristika grafa Traženje

{D[v]=E[u][v]; Pi[v]=u; Depth[v]=Depth[u]+1;} cnt++; } // uredjeni par <v,Pi(v)> je u T, sa tezinom d[v], za v != s } int WP(int u, int v) { int w; w=INT_MAX; while (Depth[u]>Depth[v]) { if (D[u]<w) w=D[u]; u=Pi[u]; } while (Depth[v]>Depth[u]) { if (D[v]<w) w=D[v]; v=Pi[v]; } while (v!=u) { if (D[v]<w) w=D[v]; if (D[u]<w) w=D[u]; u=Pi[u]; v=Pi[v]; } return w; } void SolveP1() { int w,u,v; // w=INT_MAX; // for (int v=1; v<=N; v++) // if ((Pi[v]>0) && (D[v]<w)) // w=D[v]; // printf("%d\n",w); for(int i=1; i<=K; i++) { u=Pairs[i][1]; v=Pairs[i][2]; // printf("%d %d %d\n",u,v,WP(u,v)); printf("%d\n",WP(u,v)); } } main() { input(); CreateMST(1); SolveP1(); } 16. Detektiv Deki je odlučio da iskoristi sav svoj šarm i diplomatske sposobnosti (manipulacija i intrige) i da omogući da za svakog studenta na fakultetu važi sledeće tvrđenje: broj studenata koje student A smatra za prijatelje

Page 27: Pohlepne strategije za rad sa grafovima i izra unavanje ...jelenagr/2d/PohlepniGrafovi.pdfPohlepne strategije za rad sa grafovima i izra čunavanje nekih karakteristika grafa Traženje

se razlikuje najviše za 1 od broja studenata koji studenta A smatraju za prijatelja. Dakle, ako zamislimo da svaki student je čvor grafa i da činjenica da A smatra da mu je B prijatelj se može predstaviti usmerenom granom od A do B u grafu, onda Dekijeva želja je zapravo da se za svaki čvor broj ulaznih grana razlikuje od broja izlaznih grana najviše za 1. Naš detektiv Deki zna sve parove studenata na fakultetu koji su poznanici (tj. u grafu između njih postoji neusmerna grana). Deki može šarmom i diplomatijom da primora bilo koji par poznanika da izmene svoj odnos, tako da je jedan od njih počinje da smatra drugog studenta za prijatelja ili obrnuto, ali ne i da oba studenta u isto vreme se uzajamno smatraju za prijatelja, jer Deki je protivnik kreiranja klanova i uzajamnih prijateljstava. On želi da izvrši svoj pokvareni plan tako što će"usmeriti" sve grane grafa - odnosno svako poznanstvo će pretvoriti u jednosmerno prijateljstvo. Proverite da li Deki može to da uradi i ako može prikažite neku moguću orijentaciju grana grafa da bi se postigao Dekijev plan. Ulaz U prvoj liniji standardnog ulaza se zadaju dva cela broja N, M (1 ≤ N ≤ 1000 ,1 ≤ M ≤ 100000) koji redom predstavljaju broj studenata na fakultetu i broj poznanstava. U narednih M linija su dati parovi brojeva P1 i P2, (1 ≤P1, P2 ≤ N), koji označavaju da studenti P1 i P2 su poznanici. Svako poznanstvo se kao ulazni podatak zadaje tačno jednom. Svi brojčani ulazni podaci su pozitivni celi brojevi. Izlaz U prvoj linji standardnog izlaza napišite “Da” ako je moguća takva orijentacija grana grafa, ili “Ne” ako nije moguće orijentisati graf na gore opisani način. Ako odgovor jeste “Da” onda na svkoj od narednih M linija je potrebno štampati par celih brojeva P1 P2, koji označavaju da P1 smatra da mu je P2 prijatelj. Ako postoji više načina za orijentaciju grana grafa, odšampajte bilo koji način. Primer Ulaz Izlaz 5 7 1 2 1 3 4 1 1 5 3 2 4 5 3 5

Da 1 2 3 1 4 1 1 5 2 3 5 4 3 5

Objašnjenje: Postoji 5 studenta i 7 poznanstava među njima. Nakon orijentacija grana grafa, svaki student (osim studenata 5 i 3) ima broj prijatelja koji je jednak broju studenata koji njega smatraju za prijatelja. Student broj 5 ima za 1 veći broj studenata koji njega smatraju za prijtelja. Student broj 3 ima za 1 veći broj studenata koje on smatra za prijatelje. Rešenje: Moramo polazni graf dopuniti fiktivnim neorijentisanim granama sa ciljem da dobijemo Ojlerov graf (tj. da stepen svakog čvora bude paran). To možemo uvek uraditi, jer u polaznom grafu uvek postoji paran broj čvorova sa neparnim stepenom (suma stepena svih čvorova je paran broj jer je ta suma jednaka dvostrukom broju grana grafa). Potom, pokrenimo algoritam da u novom grafu pronađe Ojlerov ciklus. Time se prošireni graf orijentiše tako da ulazni stepen svakog čvora je jednak izlaznom stepenu. Kako smo svakom čvoru dodali najviše jednu fiktivnu granu, onda nakon njihovog uklanjanja, dobijamo da se ulazni i izlazni stepen razlikuju najviše za jedan (što smo i želeli). #include <cstdio> #include <cstring> #include <cstdlib> #include <iostream> #define MAX_NODES 1024 #define MAX_EDGES 131072 using namespace std;

Page 28: Pohlepne strategije za rad sa grafovima i izra unavanje ...jelenagr/2d/PohlepniGrafovi.pdfPohlepne strategije za rad sa grafovima i izra čunavanje nekih karakteristika grafa Traženje

struct Edge { int next; int node1, node2; int fictive, dir; }; int n, m; int start[MAX_NODES]; Edge edges[MAX_EDGES << 1]; int numEdges; void addEdge(int node1, int node2, int fictive) { for (int i = 0; i < 2; i++) { edges[numEdges].node1 = node1; edges[numEdges].node2 = node2; edges[numEdges].fictive = fictive; edges[numEdges].dir = -1; edges[numEdges].next = start[node1]; start[node1] = numEdges++; node1 ^= node2 ^= node1 ^= node2; } } void euler(int node) { for (int idx = start[node]; idx != -1; idx = edges[idx].next) { if (edges[idx].dir == -1) { edges[idx ^ 0].dir = 0; edges[idx ^ 1].dir = 1; euler(edges[idx].node2); } } } int main(void) { // Inicijalizacija numEdges = 0; memset(start, -1, sizeof(start)); // Ocitavanje ulaza i formiranje grafa u nizu grana(slogova) edges fscanf(stdin, "%d %d", &n, &m); for (int i = 0; i < m; i++) { int n1, n2; fscanf(stdin, "%d %d", &n1, &n2); addEdge(n1 - 1, n2 - 1, 0); } // dodavanje fiktivnih grana int last = -1; for (int i = 0; i < n; i++) {

Page 29: Pohlepne strategije za rad sa grafovima i izra unavanje ...jelenagr/2d/PohlepniGrafovi.pdfPohlepne strategije za rad sa grafovima i izra čunavanje nekih karakteristika grafa Traženje

int parity = 0; for (int idx = start[i]; idx != -1; idx = edges[idx].next) parity ^= 1; if (parity == 1) { if (last == -1) last = i; else { addEdge(last, i, 1); last = -1; } } } // za svaku povezanu komponentu grafa, pokrenuti //algoritam za trazenje Ojlerovog ciklusa i orijentisanje grana //tako da da ulazni stepen svakog čvora je jednak izlaznom stepenu for (int i = 0; i < numEdges; i++) if (edges[i].dir == -1) euler(edges[i].node1); fprintf(stdout, "Da\n"); for (int i = 0; i < numEdges; i++) if (!edges[i].fictive && edges[i].dir == 0) fprintf(stdout, "%d %d\n", edges[i].node1 + 1, edges[i].node2 + 1); cout<<endl; return 0; } 17. Ako je ekscentricitet čvora i grafa G(V,E) maksimum najkraćih rastojanja od svih ostalih čvorova, napisati C program koji će odrediti čvor najmanjeg ekscentriciteta – središte grafa. Primena: određivanje optimalne lokacije, na primer, za stanicu hitne pomoći. Uputstvo. Korišćenjem Flojdovog algoritma odrediti najkraća rastojanja između svih čvorova. Zatim, odrediti min ekscentriciteta svih čvorova grafa. 18. Dato je n kutija dimenzija (xi, yi, zi). Odrediti maksimalni broj kutija koje se mogu staviti jedna u drugu. Uputstvo: Formirati matricu veze A u kojoj je ai, j = −1, ako se u i-tu kutiju može smestiti kutija j, u protivnom a i, j = ∞ (MAX ). Zatim, primenom Flojdovog algoritma odrediti matricu dužina "najkraćih puteva". Traženi maksimalni broj kutija je abs( min (ai j)) + 1, i j ∈1, .. , n

10. Iz datog niza reči izdvojiti reči koje obrazuju najduži podniz reči takvih da svake dve susedne imaju zajednički segment od najmanje dva znaka. Na primer, 'NEVEN' i 'VENAC' mogu biti dve susedne reči. Uputstvo: Formirati matricu veze A u kojoj je ai, j = −1, ako se na i-tu reč može nadovezati j-ta reč, u protivnom a i, j = ∞ (MAX ). Zatim, primenom Flojdovog algoritma odrediti matricu dužina "najkraćih puteva". Traženi maksimalni broj reči je abs( min (ai j)) + 1, i j ∈1, .. , n

19. U bari se nalazi n lokvanja. Svaki lokvanj je dat koordinatama svog centra. Kreirati metod kojim se određuje minimalna dužina skoka koju treba da ima žaba da bi mogla od lokvanja s da dođe do lokvanja q a da se ne pokvasi, za date indekse s i q.

Page 30: Pohlepne strategije za rad sa grafovima i izra unavanje ...jelenagr/2d/PohlepniGrafovi.pdfPohlepne strategije za rad sa grafovima i izra čunavanje nekih karakteristika grafa Traženje

Resenje:

Formiramo graf čiji su čvorovi lokvanji. Svaka dva čvora su povezana ivicom čija je dužina jednaka rastojanju između lokvanja. Nizom A date su koordinate centara svakog od lokvanja. Za formirani graf kreiramo minimalno drvo razapinjanja, Primovim algoritmom, počev od čvora s dok ne stignemo do čvora q. Najduža ivica tog drveta je tražena minimalna dužina skoka.

20. Položaj svakog od n gradova zadat je koordinatama x i y. Izgraditi najjeftiniju putnu mrežu, tako da su svi gradovi povezani. Putevi su direktni i nema raskrsnica. Ako se seku prave se nadvožnjaci i ne može se preći sa jednog na drugi. Cena jedne dužne jedinice puta jednaka je jednoj novčanoj jedinici. Duž prave y=x teče reka. Za svaki prelaz preko reke gradi se most koji košta dodatno 3 novčane jedinice. Kreirati metod kojim se određuje ukupna cena najjeftinije putne mreže.

Resenje:

Formiramo graf čiji su čvorovi gradovi, svaka dva čvora su povezana ivicom čija je dužina jednaka rastojanju između gradova koje povezuje. Ako su dva grada sa različite strane reke (prave x=y) dužina ivice se uveća za 3. Odredimo minimalno drvo razapinjanja i zbir svih ivica u drvetu je traženi rezultat.