This is an old revision of the document!
# Laborator 09: Drumuri minime în grafuri: sursă / destinație unică. (1/2)
w[u][v] \ge 0
node$ pentru care estimarea este minimă și această se consideră finalizată. Deoarece acum distanța de la nodul sursă la $u$ este finală, se relaxează toate muchiile care pornesc din $node$, care sunt de forma $(node, neigh)
+∞
source = 1
d[node] = +∞$, pentru $node = 1:9$
* $p[node] = null$, pentru $node = 1:9
pq = \{\}$ (coadă de priorități în care vom băga elemente $(node, d[node])
d[1] = 0$
* $p[1] = null$
* $pq.push( (1, 0) )
pq = \{ (1, 0) \}$ => $pq.{pop\_min}()$ scoate $node = 1
(1, 2)$: Verificăm dacă $d[1] + w[1][2] < d[2]$ (adică $0 + 1 < +∞
d[2] = d[1] + w[1][2] = 0 + 1 = 1
p[2] = 1
pq.push( (2, 1) )
(1, 3)$: Verificăm dacă $d[1] + w[1][3] < d[3]$ (adică $0 + 1 < +∞
d[3] = 0 + 1 = 1$
* $p[3] = 1$
* $pq.push( (3, 1) )$
* $(1, 6)$: Verificăm dacă $d[1] + w[1][6] < d[6]$ (adică $0 + 1 < +∞
d[6] = 0 + 1 = 1$
* $p[6] = 1$
* $pq.push( (6, 1) )$
* $pq = \{ (2, 1); (3, 1); (6, 1); \}$ => $pq.{pop\_min}()$ scoate $node = 2
(2, 8)$: Verificăm dacă $d[2] + w[2][8] < d[8]$ (adică $1 + 10 < +∞
d[8] = 1 + 10 = 11$
* $p[8] = 2$
* $pq.push( (8, 11) )$
* $pq = \{ (3, 1); (6, 1); (8, 11); \}$ => $pq.{pop\_min}()$ scoate $node = 3
(3, 4)$: Verificăm dacă $d[3] + w[3][4] < d[4]$ (adică $1 + 2 < +∞
d[4] = 1 + 2 = 3$
* $p[4] = 3$
* $pq.push( (4, 3) )$
* $pq = \{ (6, 1); (4, 3) (8, 11); \}$ => $pq.{pop\_min}()$ scoate $node = 6
(6, 7)$: Verificăm dacă $d[6] + w[6][7] < d[7]$ (adică $1 + 2 < +∞
d[7] = 1 + 2 = 3$
* $p[7] = 6$
* $pq.push( (7, 3) )$
* $pq = \{ (4, 3); (7, 3) (8, 11); \}$ => $pq.{pop\_min}()$ scoate $node = 4
(4, 5)$: Verificăm dacă $d[4] + w[4][5] < d[5]$ (adică $3 + 0 < +∞
d[5] = 3 + 0 = 3$
* $p[5] = 4$
* $pq.push( (5, 3) )$
* $pq = \{ (5, 3); (7, 3) (8, 11); \}$ => $pq.{pop\_min}()$ scoate $node = 5
(5, 8)$: Verificăm dacă $d[5] + w[5][8] < d[8]$ (adică $3 + 1 < 11
d[8] = 3 + 1 = 4$
* $p[8] = 5$
* $pq.push( (8, 4) )
pq = \{ (7, 3) (8, 4); \}$ => $pq.{pop\_min}()$ scoate $node = 7
(7, 8)$: Verificăm dacă $d[7] + w[7][8] < d[8]$ (adică $3 + 2 < 4
pq = \{ (8, 4); \}$ => $pq.{pop\_min}()$ scoate $node = 8
pq = \{ \}
1, 2, 3, 6, 4, 5, 7, 8
source = 1
(5, 1)$ (pentru că $d[5] + w[5][1] = 1 - 2 = -1 < d[1]$). Acest lucru duce la $d[1] = -1
T = O(m * log n)\ sau\ O(|E| * log |V|)
S = O(n)
O(log n)$, deci $O(m * log n)$ în total pentru relaxări. În plus, se fac $n$ ștergeri, adică $O(n * log n)$, însă acest termen se poate neglija (presupunem că $n « m
m
O(m log n)
O(n logn + m)
w[u][v]
d$ și vectorul de părinți $p
source = 1
d[node] = +∞$, pentru $node = 1:5n$
* $p[node] = null$, pentru $node = 1:5
d[1] = 0$
* $p[1] = null$
* STEP 2: Avem 5 noduri, relaxăm de 4 ori ($n - 1$ ori) toate muchiile din graf. Ordinea nu contează, pentru simplitate vom relaxa muchiile în ordine lexico-grafică: $(1, 2); (1, 3); (2, 3); (3, 4); (4, 2); (4, 5)
(1, 2)$: Verificăm dacă $d[1] + w[1][2] < d[2]$ (adică $0 - 1 < +∞
d[2] = d[1] + w[1][2] = 0 - 1 = -1
p[2] = 1
(1, 3)$: Verificăm dacă $d[1] + w[1][3] < d[3]$ (adică $0 - 2 < +∞
d[3] = 0 - 2 = -2$
* $p[3] = 1$
* $(2, 3)$: Verificăm dacă $d[2] + w[2][3] < d[3]$ (adică $-1 + 0 < -2). NU, atunci relaxarea muchiei NU are loc.
* timp de execuție
</note>
### BONUS La acest laborator, asistentul va alege 1-2 probleme din secțiunea extra.
### Extra * [infoarena/distante](https://infoarena.ro/problema/distante) * [infoarena/catun](https://infoarena.ro/problema/catun) * [infoarena/lanterna](https://infoarena.ro/problema/lanterna) * [infoarena/ciclu](https://infoarena.ro/problema/ciclu) * [codeforces/the-classic-probem](https://codeforces.com/contest/464/problem/E) * [codeforces/planets](https://codeforces.com/contest/229/problem/B) * [acm/sightseeingtrip](http://poj.org/problem?id=1734)
## Referințe
[0] Chapters Single-Source Shortest Paths / All-Pairs Shortest Paths, “Introduction to Algorithms”, Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest and Clifford Stein.