АСП1/К3 2019 — разлика између измена
м (Ispravka pristupa elementima matrice) |
м (Замена начина истицања милокода.) |
||
(Није приказано 11 међуизмена другог корисника) | |||
Ред 1: | Ред 1: | ||
{{tocright}} | |||
[https://rti.etf.bg.ac.rs/rti/ri3sp/rokovi/13S111ASP1_K3_1819.pdf Zadaci] | [https://rti.etf.bg.ac.rs/rti/ri3sp/rokovi/13S111ASP1_K3_1819.pdf Zadaci] | ||
Ред 33: | Ред 34: | ||
Grafovi se nalaze ispod. | Grafovi se nalaze ispod. | ||
<gallery> | <gallery> | ||
ASP1 K3 2019 zadatak 2 graf. | ASP1 K3 2019 zadatak 2 graf.svg | Pojednostavljen graf iz postavke zadatka. | ||
ASP1 K3 2019 zadatak 2 MST.svg | Minimalno obuhvatno stablo. | |||
ASP1 K3 2019 zadatak 2 MST. | |||
</gallery> | </gallery> | ||
Ред 67: | Ред 67: | ||
#* <code>ADD G, F, H</code> | #* <code>ADD G, F, H</code> | ||
</div> | </div> | ||
{{Милокод|<nowiki> | |||
TOP SORT ALL PATHS R(G) | |||
if V = {} then | |||
return nil | |||
end_if | |||
return_paths = {} | |||
for {n : (n ∈ V) and ((u, n) ∉ E)} do | |||
MARK_REMOVED(G, n) | |||
paths = TOP_SORT_ALL_PATHS_R(G) | |||
for path ∈ paths do | |||
new_path = GETNODE | |||
value(new_path) = n | |||
next(new_path) = path | |||
path = new_path | |||
end_for | |||
UNMARK_REMOVED(G, n) | |||
return_paths = return_paths + paths | |||
end_for | |||
return return_paths | |||
</nowiki>}} | |||
== 4. zadatak == | == 4. zadatak == | ||
Ред 92: | Ред 94: | ||
=== Rešenje === | === Rešenje === | ||
Implementacija ispod čvorove vraća u ulančanoj listi. | Implementacija ispod čvorove vraća u ulančanoj listi. | ||
{{Милокод|<nowiki> | |||
K-DISTANCE(G, n, k, id) | |||
dist[n] | |||
for i = 1 to n do | |||
dist[i] = ∞ | |||
end_for | |||
dist[id] = 0 | |||
curr_dist = 0 | |||
tail = head = GETNODE(id) | |||
next(head) = GETNODE(0) | |||
head = next(head) | |||
curr = 0 | |||
temp = nil | |||
while (tail ≠ nil) and (curr_dist ≠ k) do | |||
curr = value(tail) | |||
if curr = 0 then | |||
curr_dist = curr_dist + 1 | |||
if head ≠ tail then | |||
next(head) = GETNODE(0) | |||
head = next(head) | |||
end_if | |||
else | |||
for node ∈ {v : (curr, v) ∈ E} do | |||
if dist[node] ≠ curr_dist + 1 then | |||
dist[node] = curr_dist + 1 | |||
next(head) = GETNODE(node) | |||
head = next(head) | |||
end_if | |||
end_for | |||
end_if | |||
temp = tail | |||
tail = next(tail) | |||
FREENODE(temp) | |||
end_while | |||
return tail | |||
</nowiki>}} | |||
{{Милокод|<nowiki> | |||
GETNODE(node) | |||
ALLOCATE(node) | |||
next(node) = nil | |||
value(node) = value | |||
return node | |||
</nowiki>}} | |||
== 5. zadatak == | == 5. zadatak == | ||
Ред 162: | Ред 178: | ||
=== Rešenje === | === Rešenje === | ||
[[{{ns:6}}:ASP1 K3 2019 zadatak 5 graf. | [[{{ns:6}}:ASP1 K3 2019 zadatak 5 graf.svg|thumb|Graf iz zadatka 5.]] | ||
<div class="abc-list"> | <div class="abc-list"> | ||
# Pretpostavljajući da nema grana negativne težine vidimo da je najkraći put dužine 2 i zato sigurno mora biti direktna grana između A i B. Pošto vidimo da matrica D nije simetrična pretpostavljamo da se radi o usmerenom težinskom grafu. Na osnovu trenutnog grafa i D matrice vidimo da je grana B-C težine 5, i sve ostalo se slaže. | # Pretpostavljajući da nema grana negativne težine vidimo da je najkraći put dužine 2 i zato sigurno mora biti direktna grana između A i B. Pošto vidimo da matrica D nije simetrična pretpostavljamo da se radi o usmerenom težinskom grafu. Na osnovu trenutnog grafa i D matrice vidimo da je grana B-C težine 5, i sve ostalo se slaže. | ||
# U pseudokodu ispod podrazumeva se da je put predstavljen ulančanom listom. Ukoliko je vraćeno nil to znači da nema puta. | # U pseudokodu ispod podrazumeva se da je put predstavljen ulančanom listom. Ukoliko je vraćeno nil to znači da nema puta. | ||
</div> | </div> | ||
{{Милокод|<nowiki> | |||
PATH(T, A, B, C) | |||
curr = GETNODE(C) | |||
next = nil | |||
while value(curr) ≠ B do | |||
if T[B][value(curr)] = 0 then | |||
return nil | |||
end_if | |||
next = GETNODE(T[B][value(curr)]) | |||
next(next) = curr | |||
curr = next | |||
end_while | |||
while value(curr) ≠ A do | |||
if T[A][value(curr)] = 0 then | |||
return nil | |||
end_if | |||
next = GETNODE(T[A][value(curr)]) | |||
next(next) = curr | |||
curr = next | |||
end_while | |||
return curr | |||
</nowiki>}} | |||
== 6. zadatak == | == 6. zadatak == | ||
Ред 195: | Ред 214: | ||
=== Rešenje === | === Rešenje === | ||
* Topološki poredak: '''ABDCFEHGIJK''' | * Topološki poredak: '''ABDCFEHGIJK''' | ||
* Kritični put: ''' | * Kritični put: '''ABCEHGJK''' (ili '''ABCEHGIJK''') | ||
* Tabela: | * Tabela: | ||
{| class="wikitable" | {| class="wikitable" | ||
Ред 269: | Ред 288: | ||
Grafovi su dati ispod. | Grafovi su dati ispod. | ||
<gallery> | <gallery> | ||
ASP1 K3 2019 zadatak 7 graf. | ASP1 K3 2019 zadatak 7 graf.svg | Graf iz postavke zadatka. | ||
ASP1 K3 2019 zadatak 7 rezidualni graf. | ASP1 K3 2019 zadatak 7 rezidualni graf.svg | Rezidualni graf. | ||
</gallery> | </gallery> | ||
Ред 282: | Ред 301: | ||
=== Rešenje === | === Rešenje === | ||
Složenost Dajkstrinog algoritma | Složenost Dajkstrinog algoritma zavisi od operacija pronalaženja sledećeg čvora do kojeg je put najkraći i ažuriranja matrice D sa dodavanjem novog čvora u skup S. Može biti <math>\mathcal{O(n^2)}</math> u slučaju da se pronalaženje sledećeg čvora do kojeg je put najkraći izvršava u <math>\mathcal{O(n)}</math> i da je graf predstavljen matricom susednosti. Bolja složenost dostiže se onda kada je graf predstavljen listom susednosti i operacija pronalaženja sledećeg čvora sa najkraćim putem ima složenost od <math>\mathcal{O(\log{n})}</math>, kada je složenost <math>\mathcal{O(e + n\log{n})}</math>. | ||
{{Милокод|<nowiki> | |||
DIJKSTRA ADJ LIST(G, x, y) | |||
S = {x} | |||
for i = 1 to n do | |||
d[i] = w[x, i] | |||
if d[i] = ∞ then | |||
t[i] = 0 | |||
else | |||
t[i] = x | |||
end_if | |||
end_for | |||
for k = 1 to n-1 do | |||
start_node = -1 | |||
for i ∈ (V - S) do | |||
if (start_node = -1) or (d[i] < d[start_node]) then | |||
start_node = i | |||
end_if | |||
end_for | |||
S = S + {start_node} | |||
adj_node = AL[start_node] | |||
while adj_node ≠ nil do | |||
if w[start_node, value(adj_node)] + d[start_node] < d[value(adj_node)] then | |||
d[value(adj_node)] = w[start_node, value(adj_node)] + d[start_node] | |||
t[value(adj_node)] = start_node | |||
end_if | |||
adj_node = next(adj_node) | |||
end_while | |||
end_for | |||
return d[y] | |||
</nowiki>}} | |||
[[Категорија:Рокови]] | [[Категорија:Рокови]] | ||
[[Категорија:АСП1]] |
Тренутна верзија на датум 13. септембар 2024. у 01:09
1. zadatak
Postavka
Na slici je prikazan netežinski usmereni graf.
- Prikazati redosled čvorova nakon obilaska grafa sa slike po širini, ukoliko se kao početni čvor zada čvor A. Čvorovi se ubacuju u strukturu prema leksikografskom poretku ukoliko postoji više mogućnosti.
- Prikazati redosled čvorova nakon iterativnog obilaska grafa sa slike po dubini, ukoliko se kao početni čvor zada čvor A. Čvorovi se ubacuju u strukturu prema leksikografskom poretku ukoliko postoji više mogućnosti.
Rešenje
- ABICDMFLK
- AIBCMLKDF
2. zadatak
Postavka
U nekom malom mestu se renovira mreža ulica. Sve ulice u mestu su dvosmerne. Da bi se renoviralo što više ulica, potrebno je obezbediti da između svaka dva važna objekta u mestu (škola, bolnica, opština, itd.) postoji put i da ukupna dužina svih otvorenih puteva za saobraćaj u mestu bude minimalna. Ukoliko je mreža ulica i važnih objekata predstavljena neusmerenim težinskim grafom sa slike, navesti koji algoritam bi se mogao iskoristiti za rešavanje ovog problema i njegovom primenom odrediti ulice koje treba da ostanu otvorene za saobraćaj tokom renoviranja, prema navedenim uslovima. Prikazati postupak.
Rešenje
Mogao bi se primeniti Primov ili Kruškalov algoritam za dobijanje minimlanog obuhvatnog stabla. U narednom postupku biće korišćen Primov algoritam:
- A-E
- E-F
- E-D
- D-C
- C-H
- H-I
- C-B
- H-G
- G-I
Grafovi se nalaze ispod.
3. zadatak
Postavka
Neka se posmatra sekvencijalni programski kod koji se izvršavana na nekoj 3A mašini. Prvi operand instrukcije je odredišni, a preostala dva su izvorišni operandi. Prilikom prevođenja, prevodilac može da preuredi redosled izvršavanja instrukcija da bi izvršio određene optimizacije. Međutim, preuređivanje redosleda dve instrukcije se može izvršiti samo ukoliko ne postoji zavisnosti po podacima između njih. Zavisnost po podacima između instrukcija postoji ukoliko se odredišni operand (rezultat) ranije operacije koristi kao izvorišni operand kasnije operacije.
- Opisati model grafa koji se može iskoristiti za modelovanje zavisnosti po podacima između instrukcija.
- Objasniti koji algoritam bi se mogao iskoristiti za pronalaženje svih mogućih redosleda izvršavanja instrukcija na osnovu zadatog grafa zavisnosti po podacima.
- Na primeru zadatog programskog koda, nacrtati graf zavisnosti po podacima i odrediti (napisati) još jedan moguć redosled izvršavanja instrukcija koji zadovoljava prisutne zavisnosti po podacima.
ADD A, B, C MUL C, E, D SUB B, E, C ADD A, D, E SUB E, F, G DIV D, F, H ADD G, F, H
Rešenje
- U pitanju je acikličan netežinski usmeren graf u kom čvorovi predstavljaju instrukcije a grane od jednog ka drugom čvoru predstavljaju zavisnost izvorišnih operanada drugog čvora od odredišnog operanda prvog.
- Može se iskoristiti modifikacija topološkog sortiranja gde se nakon svakog prikupljanja čvorova sa ulaznim stepenom 0 za svaki od njih pokušavaju naći svi putevi koji na tom mestu sadrže taj čvor. Rekurzivna implementacija ovog algoritma je data ispod (gde su putevi predstavljeni ulančanim listama).
- Graf se sastoji od svih čvorova odvojenih i jedne grane između čvorova
MUL C, E, D
iSUB B, E, C
.ADD A, B, C
ADD A, D, E
MUL C, E, D
SUB B, E, C
SUB E, F, G
DIV D, F, H
ADD G, F, H
TOP SORT ALL PATHS R(G) if V = {} then return nil end_if return_paths = {} for {n : (n ∈ V) and ((u, n) ∉ E)} do MARK_REMOVED(G, n) paths = TOP_SORT_ALL_PATHS_R(G) for path ∈ paths do new_path = GETNODE value(new_path) = n next(new_path) = path path = new_path end_for UNMARK_REMOVED(G, n) return_paths = return_paths + paths end_for return return_paths
4. zadatak
Postavka
Posmatra se usmeren netežinski graf. Napisati iterativnu funkciju u pseudokodu koja za prosleđeni graf sa datim brojem čvorova n pronalazi sve čvorove koji su putevima dužine tačno k udaljeni od zadatog početnog čvora id.
Rešenje
Implementacija ispod čvorove vraća u ulančanoj listi.
K-DISTANCE(G, n, k, id) dist[n] for i = 1 to n do dist[i] = ∞ end_for dist[id] = 0 curr_dist = 0 tail = head = GETNODE(id) next(head) = GETNODE(0) head = next(head) curr = 0 temp = nil while (tail ≠ nil) and (curr_dist ≠ k) do curr = value(tail) if curr = 0 then curr_dist = curr_dist + 1 if head ≠ tail then next(head) = GETNODE(0) head = next(head) end_if else for node ∈ {v : (curr, v) ∈ E} do if dist[node] ≠ curr_dist + 1 then dist[node] = curr_dist + 1 next(head) = GETNODE(node) head = next(head) end_if end_for end_if temp = tail tail = next(tail) FREENODE(temp) end_while return tail GETNODE(node) ALLOCATE(node) next(node) = nil value(node) = value return node
5. zadatak
Postavka
Floyd algoritam
- Na slici je dat izgled matrica D i T dobijenih kao izlaz Floyd algoritma. Nacrtati mogući izgled ulaznog grafa i obrazložiti odgovor.
- Napisati u pseudokodu funkciju koja na osnovu matrice T dobijene kao izlaz Floyd-ovog algoritma rekonstruiše najkraći put od čvora A do čvora C takav da se na njemu nalazi čvor B.
0 | 2 | 7 |
∞ | 0 | 5 |
∞ | ∞ | 0 |
0 | 1 | 2 |
0 | 0 | 2 |
0 | 0 | 0 |
Rešenje
- Pretpostavljajući da nema grana negativne težine vidimo da je najkraći put dužine 2 i zato sigurno mora biti direktna grana između A i B. Pošto vidimo da matrica D nije simetrična pretpostavljamo da se radi o usmerenom težinskom grafu. Na osnovu trenutnog grafa i D matrice vidimo da je grana B-C težine 5, i sve ostalo se slaže.
- U pseudokodu ispod podrazumeva se da je put predstavljen ulančanom listom. Ukoliko je vraćeno nil to znači da nema puta.
PATH(T, A, B, C) curr = GETNODE(C) next = nil while value(curr) ≠ B do if T[B][value(curr)] = 0 then return nil end_if next = GETNODE(T[B][value(curr)]) next(next) = curr curr = next end_while while value(curr) ≠ A do if T[A][value(curr)] = 0 then return nil end_if next = GETNODE(T[A][value(curr)]) next(next) = curr curr = next end_while return curr
6. zadatak
Postavka
Za graf sa slike odrediti topološki poredak, a zatim naći kritični put i dozvoljena kašnjenja za pojedinačne čvorove.
Rešenje
- Topološki poredak: ABDCFEHGIJK
- Kritični put: ABCEHGJK (ili ABCEHGIJK)
- Tabela:
Čvor | EST | LST | L |
A | 0 | 0 | 0 |
B | 1 | 1 | 0 |
C | 10 | 0 | |
D | 3 | 6 | 3 |
E | 15 | 15 | 0 |
F | 13 | 2 | |
G | 19 | 19 | 0 |
H | 16 | 16 | 0 |
I | 21 | 21 | 0 |
J | 22 | 22 | 0 |
K | 24 | 24 | 0 |
7. zadatak
Postavka
Koja su dva karakteristična načina za izbor puta povećanog protoka u protočnom grafu? Na primeru protočnog grafa sa slike u okviru koga postoji već uspostavljen protok po pojedinim granama, nacrtati rezidualni graf i navesti dva karakteristična puta koji ilustruju navedene situacije.
Rešenje
Dva karakteristična načina za izbor puta povećanog protoka su:
- običan BFS koji će naći najkraći put od S do T, na primer SBT, i
- biranje puta koji najviše povećava protok, na primer SBAT.
Grafovi su dati ispod.
8. zadatak
Postavka
Dijkstra-in algoritam
- Kolika je složenost Dijkstra-inog algoritma i od kojih operacija u okviru algoritma to zavisi? Objasniti.
- Napisati pseudokod Dijkstra-inog algoritma koji pronalazi najkraće rastojanje između para čvorova x i y pod pretpostavkom da se graf G predstavlja listama susednosti. Specijalizovati apstraktne operacije gde je to moguće.
Rešenje
Složenost Dajkstrinog algoritma zavisi od operacija pronalaženja sledećeg čvora do kojeg je put najkraći i ažuriranja matrice D sa dodavanjem novog čvora u skup S. Može biti u slučaju da se pronalaženje sledećeg čvora do kojeg je put najkraći izvršava u i da je graf predstavljen matricom susednosti. Bolja složenost dostiže se onda kada je graf predstavljen listom susednosti i operacija pronalaženja sledećeg čvora sa najkraćim putem ima složenost od , kada je složenost .
DIJKSTRA ADJ LIST(G, x, y) S = {x} for i = 1 to n do d[i] = w[x, i] if d[i] = ∞ then t[i] = 0 else t[i] = x end_if end_for for k = 1 to n-1 do start_node = -1 for i ∈ (V - S) do if (start_node = -1) or (d[i] < d[start_node]) then start_node = i end_if end_for S = S + {start_node} adj_node = AL[start_node] while adj_node ≠ nil do if w[start_node, value(adj_node)] + d[start_node] < d[value(adj_node)] then d[value(adj_node)] = w[start_node, value(adj_node)] + d[start_node] t[value(adj_node)] = start_node end_if adj_node = next(adj_node) end_while end_for return d[y]