Natjecateljsko programiranje Autor i predavač ovog predavanja: Bruno Rahle Kontakt Kontakt mob: 099/BRAHLE0

Similar documents
Struktura indeksa: B-stablo. ls/swd/btree/btree.html

SIMPLE PAST TENSE (prosto prošlo vreme) Građenje prostog prošlog vremena zavisi od toga da li je glagol koji ga gradi pravilan ili nepravilan.

Biznis scenario: sekcije pk * id_sekcije * naziv. projekti pk * id_projekta * naziv ꓳ profesor fk * id_sekcije

CJENIK APLIKACIJE CERAMIC PRO PROIZVODA STAKLO PLASTIKA AUTO LAK KOŽA I TEKSTIL ALU FELGE SVJETLA

SAS On Demand. Video: Upute za registraciju:

IZDAVANJE SERTIFIKATA NA WINDOWS 10 PLATFORMI

Podešavanje za eduroam ios

GUI Layout Manager-i. Bojan Tomić Branislav Vidojević

Korak X1 X2 X3 F O U R T W START {0,1}

Windows Easy Transfer

Advertising on the Web

Uvod u relacione baze podataka

Nejednakosti s faktorijelima

Tutorijal za Štefice za upload slika na forum.

AMRES eduroam update, CAT alat za kreiranje instalera za korisničke uređaje. Marko Eremija Sastanak administratora, Beograd,

Upute za korištenje makronaredbi gml2dwg i gml2dgn

PROJEKTNI PRORAČUN 1

Port Community System

Ulazne promenljive se nazivaju argumenti ili fiktivni parametri. Potprogram se poziva u okviru programa, kada se pri pozivu navode stvarni parametri.

BENCHMARKING HOSTELA

Eduroam O Eduroam servisu edu roam Uputstvo za podešavanje Eduroam konekcije NAPOMENA: Microsoft Windows XP Change advanced settings

Bojanje grafova prilagodljivim metaheurističkim postupcima

Klasterizacija. NIKOLA MILIKIĆ URL:

Fakultet strojarstva i brodogradnje ZAVRŠNI RAD

KAPACITET USB GB. Laserska gravura. po jednoj strani. Digitalna štampa, pun kolor, po jednoj strani USB GB 8 GB 16 GB.

TRAJANJE AKCIJE ILI PRETHODNOG ISTEKA ZALIHA ZELENI ALAT

Idejno rješenje: Dubrovnik Vizualni identitet kandidature Dubrovnika za Europsku prijestolnicu kulture 2020.

KAKO GA TVORIMO? Tvorimo ga tako, da glagol postavimo v preteklik (past simple): 1. GLAGOL BITI - WAS / WERE TRDILNA OBLIKA:

RJEŠAVANJE BUGARSKOG SOLITERA

- Vežba 1 (dodatan materijal) - Kreiranje Web šablona (template) pomoću softvera Adobe Photoshop CS

PROGRAMIRANJE I ALGORITMI

Bušilice nove generacije. ImpactDrill

RANI BOOKING TURSKA LJETO 2017

Otpremanje video snimka na YouTube

OPTIMIZACIJA PROMETNIH PROCESA

1. Instalacija programske podrške

Naredba je uputa računalu za obavljanje određene operacije.

Izbor energetski optimalne rute električnog vozila s obzirom na konfiguraciju terena

KONFIGURACIJA MODEMA. ZyXEL Prestige 660RU

WELLNESS & SPA YOUR SERENITY IS OUR PRIORITY. VAŠ MIR JE NAŠ PRIORITET!

Programiranje. Nastava: prof.dr.sc. Dražena Gašpar. Datum:

ENR 1.4 OPIS I KLASIFIKACIJA VAZDUŠNOG PROSTORA U KOME SE PRUŽAJU ATS USLUGE ENR 1.4 ATS AIRSPACE CLASSIFICATION AND DESCRIPTION

MINISTRY OF THE SEA, TRANSPORT AND INFRASTRUCTURE

Sudoku. Ivo Doko, Saša Buzov. PMF Matematički odsjek, Sveučilište u Zagrebu

Tema 2: Uvod u sisteme za podršku odlučivanju (VEŽBE)

Upotreba selektora. June 04

CJENOVNIK KABLOVSKA TV DIGITALNA TV INTERNET USLUGE

Ana Ćosić PRIMJENA TEORIJE GRAFOVA KOD PROBLEMA TRANSPORTNE OPSKRBE BANKOMATA PRIVREDNE BANKE ZAGREB

TRENING I RAZVOJ VEŽBE 4 JELENA ANĐELKOVIĆ LABROVIĆ

Ključ neposrednog prosvjetljenja izvadak iz kolekcije predavanja besplatnini primjerak

JEDINSTVENI PORTAL POREZNE UPRAVE. Priručnik za instalaciju Google Chrome dodatka. (Opera preglednik)

PODSUSTAV ZA UPRAVLJANJE SPREMNIKOM UGRADBENOG RAČUNALA

Optimizacija ruta vozila za potrebe istraživanja kvalitete mobilne mreže primjenom algoritama za rješavanje problema trgovačkog putnika

KABUPLAST, AGROPLAST, AGROSIL 2500

1.7 Predstavljanje negativnih brojeva u binarnom sistemu

CRNA GORA

Mogudnosti za prilagođavanje

STABLA ODLUČIVANJA. Jelena Jovanovic. Web:

Srđana Obradović. Teorija brojeva u nastavi matematike. Diplomski rad

Trening: Obzor financijsko izvještavanje i osnovne ugovorne obveze

Bear management in Croatia

math.e Fibonaccijev brojevni sustav 1 Uvod Fibonaccijev brojevni sustav math.e Vol 16. Hrvatski matematički elektronički časopis

UNIVERZITET U BEOGRADU RUDARSKO GEOLOŠKI FAKULTET DEPARTMAN ZA HIDROGEOLOGIJU ZBORNIK RADOVA. ZLATIBOR maj godine

NIS PETROL. Uputstvo za deaktiviranje/aktiviranje stranice Veleprodajnog cenovnika na sajtu NIS Petrol-a

Croatian Automobile Club: Contribution to road safety in the Republic of Croatia

PROBLEM ODREĐIVANJE MAKSIMALNOG TOKA U GRAFU FORD FULKERSON ALGORITAM MAKSIMALNOG PROTOKA (FFF ALGORITAM)

Pravljenje Screenshota. 1. Korak

INSTALIRANJE SOFTVERSKOG SISTEMA SURVEY

SASTAVLJANJE OPTIČKIH MAPA: MODUL ZA KOREKCIJU GRAFA

Financijska matematika. Teorija grafova Optimizacija Rata. 4. vježbenica

Implementacija sparsnih matrica upotrebom listi u programskom jeziku C

Val serija poglavlje 08

Office 365, upute za korištenje elektroničke pošte

11 Analiza i dizajn informacionih sistema

Primjer 3 Prikaz i interpretacija rezultata

Uticaj parametara PID regulatora i vremenskog kašnjenja na odziv i amplitudno-faznu karakteristiku sistema Simulink

SADRŽAJ, OD NAJSTARIJIH PREMA NAJNOVIJIM BLOGOVIMA

LabVIEW-ZADACI. 1. Napisati program u LabVIEW-u koji računa zbir dva broja.

Tema 11 Analiza algoritama, pretraživanje i sortiranjeu jeziku Python

- je mreža koja služi za posluživanje prometa između centrala

Halina, Hesus. (Advent) œ N œ œ œ. œ œ œ œ œ. œ. œ œ œ œ. œ œ. C F G7sus4. œ. # œ œ J œ œ œ J. œ œ. J œ. # œ. # œ œ œ

Struktura i organizacija baza podataka

Strategije rješavanja problemskih zadataka

Val serija 8. dio. Mnogi ljudi su pisali i pitali o "želji za znanjem." Njima se čini da je sticanje i prikupljanje znanja jedna OPS aktivnost.

PODEŠAVANJE PARAMETARA GENETSKOG ALGORITMA

PSIHOPATOLOGIJA. Autor: Dr Radojka Praštalo. Psihopatologija

ECONOMIC EVALUATION OF TOBACCO VARIETIES OF TOBACCO TYPE PRILEP EKONOMSKO OCJENIVANJE SORTE DUHANA TIPA PRILEP

RJEŠAVANJE PROBLEMA USMJERAVANJA I DODJELJIVANJA VALNIH DULJINA U WDM OPTIČKIM MREŽAMA PRIMJENOM METAHEURISTIKA

int[] brojilo; // polje cjelih brojeva double[] vrijednosti; // polje realnih brojeva

Commissioned by Paul and Joyce Riedesel in honor of their 45th wedding anniversary. Lux. œ œ œ - œ - œ œ œ œ œ œ œ œ œ œ. œ œ œ œ œ œ œ œ œ.

Big Data: kako smo došli do Velikih podataka i kamo nas oni vode

Svojstva olovke x (0,0)

RJEŠAVANJE PROBLEMA BOJANJA GRAFOVA PRIMJENOM HIBRIDNOG EVOLUCIJSKOG ALGORITMA

Kapitalizam i otpor u 21. veku

PASCAL - Skripta sa zadacima i rješenjima -

- Italy. UNIVERZALNA STANICA ZA ZAVARIVANJE, SPOTER - sa pneumatskim pištoljem sa kontrolnom jedinicom TE95-10 KVA - šifra 3450

Sveučilište Jurja Dobrile u Puli Odjel za informacijsko komunikacijske znanosti TOMISLAV ĐURANOVIĆ USPOREDBA ALGORITAMA SORTIRANJA.

Kreativne metode znanstvenog rada u metodi konačnih elemenata

Sadržaj. Tekst Fontovi Boje Pozadine Grafika Animacija Pravopis Savjeti za izlaganje prezentacije

3D GRAFIKA I ANIMACIJA

Transcription:

Natjecateljsko programiranje Autor i predavač ovog predavanja: Bruno Rahle Kontakt e-mail: brahle@gmail.com; Kontakt mob: 099/BRAHLE0

Teorija (~10 min) Gladijatori(~40 min) BFS (~20 min) DFS (~15 min) Česte pogreške (~5 min) Težinski grafovi (~60 min) Bellman-Ford (~15 min) Dijkstra (~15 min) Floyd-Warshall (~15 min) Pitanja (~15 min) Rješavanje zadataka BFS Dijkstra

Ponavljanje teorije

Što je to graf? Što je to brid? Što je to čvor? Ima li pitanja?

Opis rješenja BFS DFS

1. ideja Ako za svakog gladijatora posebno odaberemo je li on dobar ili loš, možemo lagano provjeriti je li takav raspored rješenje Složenost: O(2^N + M) prevelika je 1 primjer 2. ideja Možemo poboljšati prvu meet-in-the-middle idejom Složenost: O(2^(N/2) + M) i dalje je prevelika 2 primjera

1. opservacija: Prema uvjetima iz zadatka, gladijatore možemo podijeliti u dva skupa, A i B Možemo ispisati bilo koji 2. opservacija Ako smo za nekog gladijatora odabrali kojem on skupu pripada, tada znamo da njegovi rivali moraju pripadati onom drugom To opet možemo ponoviti za sve rivale početnog gladijatora Ako za nekog gladijatora dobijemo da pripada u oba skupa, rješenje očito ne postoji

3. ideja Iskoristimo 1. i 2. opservaciju Ako iskoristimo 2. opservaciju, možemo se jednostavno osigurati da svakog gladijatora obiđemo točno jednom Složenost: O(N+M) dovoljno dobra Algoritam #1 1. ako ima neobrađenih gladijatora 2. odaberi bilo kojeg 3. stavi da je dobar i za sve rivale stavi da su loši 4. za svakog novog lošeg 5. sve rivale stavi da su dobri 6. za svakog novog dobrog 7. sve rivale stavi da su loši 8. ako ima bar jedan novi loši, vrati se na korak 4 9. vrati se na korak 1 10. ako smo za bilo kojeg gladijatora upotrijebili više skupova,

(dio) pseudokoda za Algoritam #1: dok ima neobrađenih gladijatora sad neki neobrađeni gladijator sad.skup dobar za svaki rival iz sad.rivali: rival.skup loš skup_loših += rival za svaki loš iz skup_loših: za svaki rival iz loš.rivali: rival.skup dobar skup_dobrih += rival za svaki dobar iz skup_dobrih: za svaki rival iz dobar.rivali: rival.skup loš skup_loših += rival

Algoritam #1 je nepregledan i nepotpun (što nedostaje?); pseudokod još više Može li se bolje / jednostavnije? Odgovor je DA.

Problem se vrlo jednostavno svede na problem na grafu: Čvorovi neka su nam gladijatori Bridovi neka su rivalstva Česta metoda za rješavanje ovakvog tipa zadatka je slijedeća: Pobojamo čvorove u dvije boje (jedna neka predstavlja dobre, a druga loše momke) Lako je pokazati da rješenje postoji ako i samo ako dva čvora iste boje nisu povezana bridom

Kako ćemo bojati čvorove? Budući da je svejedno gdje počnemo i koju boju odaberemo za početni čvor, najjednostavnije je ići redom po čvorovima i tražiti prvi koji nismo još pobojali te za njega pozvati funkciju pobojaj.

Što će raditi funkcija pobojaj? Ona će čvor pobojati u boju 1, sve njegove susjede u 0, sve susjede susjeda u 1, itd. dok ne naiđe na čvorove koji su već pobojani. Ako se ikada dogodi da je boja čvora drugačija od one u koje bi je trebali sada pobojati, funkcija vrati 0, a inače vrati 1.

Kako ćemo osigurati da funkcija pobojaj prođe kroz sve čvorove? Obilazit ćemo ih sistematski. Susjede svakog čvora obilazit ćemo redom kako ih pamtimo u listi susjedstva. Ako neki čvor još nismo obišli stavimo ga u red čvorova koje moramo obići. Gore navedena ideja zove se pretraživanje u širinu breadth-first search (BFS)

Što je to struktura red (queue)? To je vrlo jednostavna struktura koja podržava slijedeće operacije: stavi element na kraj (push) uzmi element sa početka (front) makni element sa početka (pop) Implementacija pomoću jednostruko povezane liste niza (ako je poznat maksimalan broj elemenata u redu) gotova klasa iz jezika (ako postoji) Tu valja imati na umu da je ponekad gotova klasa spora!

Promotrimo prvi primjer iz teksta zadatka

Na početku su svi čvorovi neobojeni, stoga ćemo izabrati 1 za početak Pobojamo ga u zeleno Sve njegove susjede (to su 2 i 4) pobojat ćemo u plavo i dodati u red one koje do sada nismo obojali U redu su sada 2 i 4

Idući element u redu je 2 Sve njegove susjede (to su 1 i 3) obojamo u zeleno i one koji još nisi imali boju (samo 3) dodamo na kraj reda U redu su sada 4 i 3

Idući element u redu je 4 Sve njegove susjede (to su 1, 3 i 5) obojamo u zeleno i one koji još nisi imali boju (samo 5) dodamo na kraj reda U redu su sada 3 i 5

Kad budemo pregledavali preostale čvorove u redu (3 i 5) nećemo otkriti ništa novo, pa taj dio simulacije preskačemo Više nema neobojanih čvorova, sve smo uspjeli pobojati pa ispišemo ili zelene ili plave

Pseudokod #2: riješi: za svaki čvor iz grafa: ako čvor.boja nije postavljena: ako je pobojaj( čvor ) netočno: vrati netočno vrati točno pobojaj( čvor ): ako je čvor.boja <> -1: vrati točno čvor.boja = 1 Q.push(čvor) dok ima elemenata u Q: sad Q.pop() za svaki susjed iz sad.susjedi: ako je susjed.boja = -1: susjed.boja 1-sad.boja Q.push(susjed) inače ako je susjed.boja <> 1-sad.boja: vrati netočno vrati točno

Možemo li kod napraviti još kraćim? (Zašto bismo to htjeli?) Odgovor je, pogađate, da! Taj način svodi se na to da funkciju pobojaj napišemo u rekurzivnom obliku. Napomena 1: promjenom funkcije u rekurzivan oblik dobit ćemo novi redoslijed kojim ćemo obilaziti čvorove, ali suština ostaje ista Napomena 2: kako je u nekim jezicima stack loše napravljen, ponekad treba izbjegavati rekurzije

Pseudokod #3: riješi: za svaki čvor iz grafa: ako čvor.boja nije postavljena: ako je pobojaj( čvor, 1 ) netočno: vrati netočno vrati točno pobojaj( čvor, boja ): ako je čvor.boja <> -1: vrati čvor.boja = boja čvor.boja = boja za svaki susjed iz čvor.susjedi: ako je pobojaj( susjed, 1-boja ) netočno: vrati netočno vrati točno

BFS ćemo najčešće koristiti kada treba pronaći najkraći put od nekog čvora u bestežinskom grafu Očito je da će udaljenost do promatranog čvora biti za jedan veća od udaljenosti do čvora iz kojeg smo u njega došli Ako zapamtimo iz kojeg smo čvora došli u promatrani, lako možemo napraviti i rekonstrukciju Nekoliko dogovora Boje će nam govoriti neke podatke o čvoru Bijela čvor još nismo otkrili (ne nalazi se u redu) Siva čvor smo otkrili, ali ga nismo obradili (nalazi se u redu) Crna čvor smo obradili (već smo ga izbacili iz reda)

Pseudokod: BFS( čvor ): čvor.udaljenost 0 čvor.boja siva čvor.prošli -1 Q.push(čvor) dok ima elemenata u Q: sad Q.pop() za svaki susjed iz čvor.susjedi: ako je susjed.boja = bijela: susjed.boja siva susjed.udaljenost sad.udaljenost + 1 susjed.prošli sad Q.push(susjed) sad.boja crna

Relativno lako se može pokazati da BFS ima složenost O( V + E )

Pokušaj micanja elementa iz praznog reda Zaboravljanje bojanja u sivu/crnu boju Stavljanje istog elementa više puta u red Najčešće je zbog toga što nema provjere jesmo li već posjetili čvor

DFS ćemo koristiti kada je potrebno provjeriti postoji li neki put On ne traži najkraći put DFS se vrlo lagano modificira da rješava neke složenije probleme, no o tome ćemo govoriti ako stignemo Boje imaju slijedeće značenje: Bijela čvor još nije otkriven Siva čvor se nalazi na stacku Crna čvor smo prije otkrili i izbacili sa stacka Zanimljivo svojstvo jest da, ako svaki put kad pobojamo neki čvor u sivo zapišemo otvorenu, a svaki put kad pobojamo u crno zatvorenu zagradu, dobit ćemo ispravan izraz

Pseudokod: DFS( čvor ): čvor.boja siva čvor.vrijeme_otkrivanja vrijeme++ za svaki susjed iz čvor.susjedi: ako je susjed.boja = bijela: susjed.prošli čvor DFS( susjed ) čvor.vrijeme_završavanja vrijeme++ čvor.boja crna

Kao i BFS, i DFS ima složenost O( E + V ). Dokaz je, također, relativno jednostavan.

Rušenje rekurzije - Stack overflow Previše elemenata za rekurziju treba napisati vlastiti stack Nema prekida rekurzije Zaboravljanje promjene boja

Bellman-Ford Dijkstra Floyd-Warshall

Zadan nam je težinski graf Česte verzije: Nađi najlakši put od vrha A do vrha B Nađi najlakši put od vrha A do svih ostalih vrhova Nađi sve parove najlakših putova (za svaki čvor do svakog drugog čvora nađi najlakši put) Vrlo često se umjesto pojma težina koristi i pojam duljina, jer su težine najčešće udaljenosti

1. ideja: Radimo BFS i umjesto da provjeravamo boju, provjeravamo udaljenost; ako je možemo smanjiti, stavimo čvor u red ako on već nije tamo te ju smanjimo Točno jest, ali može se naći primjer kada je složenost za red veličine lošija od optimalne

2. ideja: Ako su nam već poznate neke, ne nužno najmanje, udaljenosti do svih čvorova, put iz čvora A u čvor B možda možemo olakšati ako postoji veza E iz A u B. Kako? Neka je d niz u kojem piše zbroj težina od nekog početnog čvora (na mjestu i piše zbroj težina do i-tog čvora) Do B onda možemo doći i preko čvora A i brida E, a to će imati težinu d[a]+težina[e] Ako dovoljno puta olakšamo putove, u nizu d će pisati najmanje moguće težine

2. ideja (nastavak): Pitanja koje se sama postavljaju: Kako ćemo olakšavati bridove? Najbolje bi bilo da redom olakšavamo sve bridove Koliko puta se mora ponoviti taj proces olakšavanja bridova da bismo bili sigurni da nam je poznat najlakši put? Ako postoji negativni ciklus (znači neki ciklus kojem je suma težina negativna), tada je taj broj beskonačan. Znači, taj slučaj moramo nekako detektirati. Ako ne postoji negativni ciklus, najduži mogući najkraći put dug je V čvorova (zašto?). To znači da smo prešli V -1 bridova. Stoga, ako u V -tom koraku olakšamo neki put, znači da postoji negativni ciklus.

Time smo dobili Bellman-Fordov algoritam olakšaj( e ): vrati netočno ako je d[e.a] + e.w < d[e.b]: d[e.b] d[e.a] + e.w vrati točno ako je d[e.b] + e.w < d[e.a]: d[e.a] d[e.b] + e.w vrati točno vrati vrati Bellman-Ford(početak): d[početak] 0 V -1 puta ponovi: za svaki e iz bridova: olakšaj( e ) za svaki e iz bridova: ako je olakšaj( e ) točno: vrati netočno vrati točno

Kako bismo koji smo čvorove pronašli na najkraćem putu do nekog čvora? Postaje li kod jednostavniji ako je graf usmjeren? Kolika je složenost tog algoritma? Kada tražite udaljenost od A do B, a u grafu postoji negativan ciklus, udaljenost od A do B je - beskonačno ako je se iz A može doći u taj ciklus i iz tog ciklusa u B.

Jedan od algoritama koji se vrlo često primjenjuju jest Dijkstrin algoritam On rješava problem nalaženja puta najmanje težine iz jednog čvora na grafovima, najčešće usmjerenim, bez bridova negativne težine (takav slučaj ćemo mi promatrati) Radi na slijedećem principu Iz skupa V odabere čvor do kojeg je udaljenost najmanja Olakša sve bridove koji imaju početak u V

Pseudokod: olakšaj( e ): ako je d[e.a] + e.w < d[e.b]: d[e.b] d[e.a] + e.w Dijkstra(početak): d[početak] 0 V -1 puta ponovi: sad odaberi najmanji neobrađeni čvor po d za svaki brid iz sad.bridovi: olakšaj( brid ) sad.obrađen 1

Kolika je složenost Dijkstrinog algoritma? Složenost je jednaka O( V * složenost traženja najmanjeg po d + E ) Kako ćemo tražiti najmanji element? 1. metoda jest funkcija koja prolazi po nizu d i tamo traži element koji nismo obradili a ima najmanju vrijednost ta metoda ima složenost O( V ) pa algoritam ima složenost O( V ^2+ E )

Pseudokod za linearni nađi najmanji: nađi_najmanji: ret -1 za svaki čvor iz V: ako je čvor.obrađen = 0: ako je ret = -1 ili d[ret] > d[čvor]: ret čvor vrati ret

Kako ćemo tražiti najmanji element (nastavak)? 2. metoda je primjenom strukture koju znamo kao indeksirana gomila. Ideja je slijedeća: Za svaki čvor u gomili pamtimo kolika je njegova udaljenost od početka Operacija uzmi najmanji obavlja se u konstantnoj, a operacije izbaci i ubaci obavljaju se u logaritamskom Ukupna složenost stoga je jednaka O( ( V + E ) lg V )

Pseudokod za algoritam sa logaritamskim traženjem najmanjeg: olakšaj( e ): ako je d[e.a] + e.w < d[e.b]: gomila.izbriši(b) d[e.b] d[e.a] + e.w gomila.ubaci(b) Dijkstra(početak): d[početak] 0 V -1 puta ponovi: sad gomila.najmanji() gomila.izbriši( sad ) za svaki brid iz sad.bridovi: olakšaj( brid ) sad.obrađen 1

Koja je metoda bolja? Odgovor nije jednoznačan, ovisi o grafu Ako je graf rijedak, bolja je metoda s gomilom Ako je graf gust, bolja je metoda s linearnim traženjem U praksi se pokazalo sigurnije, ako ograničenja nisu poznata, napisati rješenje koje koristi gomilu

Zašto Dijkstrin algoritam ne radi ili ne radi dobro na grafovima s negativnim bridovima?

Ovaj algoritam pronalazi sve parove najkraćih putova na grafovima bez negativnih ciklusa Pozadina koja stoji iza njega jest dinamičko programiranje Koja je ideja? Neka nam najkraći put od A do B koji koristi samo čvorove od 1 do k označava np(a,b,k) Ako znamo najkraće putove koje koriste prvih k-1 čvorova, tada možemo jednostavno izračunati ostale koristeći rekurziju np(a,b,k) = min( np(a,b,k-1), np(a,k,k-1) + np(k,b,k-1) ) np(a,b,0) = težina(a,b)

Pseudokod: Floyd-Warshall: za svaki A od 1 do V : za svaki B od 1 do V : d[a][b][0] težina[a][b] za svaki k od 1 do V : za svaki A od 1 do V : za svaki B od 1 do V : d[a][b][k] min(d[a][b][k], d[a][k][k-1] + d[k][b][k-1])

Vremenska složenost algoritma jest O( V ^3) Ovo je odlično, ne postoji bolji način za pronalaženje svih parova najkraćih putova Memorijska složenost nije baš bajna, ona je također O( V ^3). Može li se to bolje? Naravno da može! Budući da uvijek smanjujemo rezultat, a bitan nam je samo konačni, možemo u koraku k pisati po polju d iz koraka k-1. (Ako prebrišemo neki broj i stavimo manji, koji bismo i tako poslije dobili, nismo narušili konačni rezultat.)

Konačni pseudokod: Floyd-Warshall: za svaki A od 1 do V : za svaki B od 1 do V : d[a][b] težina[a][b] za svaki k od 1 do V : za svaki A od 1 do V : za svaki B od 1 do V : d[a][b] min(d[a][b], d[a][k] + d[k][b])

Vrlo se često dogodi da se umjesto A, B i k koriste i, j i k. Tada može potkrasti i krivi redoslijed for petlji.

Koze Gondor Marica Grunf

Koze - zadaća Gondor Marica Grunf - zadaća

Na iduća četiri slajda možete pronaći kratke upute kako riješiti zadatke ako ih ne želite vidjeti (što preporučamo), preskočite ih

Rješenje: BFS ili DFS(u svakom prostoru prebrojimo koliko ima koza i vukova)

Rješenje: Dijkstra Krijes = čvor, putanja strijele = brid, udaljenost krjesova = težina

Rješenje: Dijkstra Prvo treba naći najkraći put od 1 do N Nakon toga treba redom zabranjivati po jedan brid iz tog najkraćeg puta te na tom grafu tražiti najkraći put od 1 do N. Traženo rješenje je najduži takav put.

Rješenje: Bellman-Ford Problem se svede na zbrajanje tako da se na početku uzme logaritam od cijena, a na kraju zbroj iskoristi kao potencija odgovarajuće baze Ako postoji negativan ciklus, treba se paziti može li se doći u njega i ona potom iz njega u krajnji čvor

Wikipedija Slobodna enciklopedija Cormen, Leiserson, Rivest, Stein: Introduction to Algorithms; MIT Press, 2nd edition Sedgewick: Algorithms in C++, Addison-Wesley, 3rd edition