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.
d[2] = -3 + 1 = -2$
* $p[2] = 3$
* $(4, 5)$: Verificăm dacă $d[4] + w[4][5] < d[2]$ (adică $-3 + 1 < +∞
d[5] = -3 + 1 = -2$
* $p[5] = 4
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 - 2 < -2
d[3] = -1 -2 = -3$
* $p[3] = 2$
* $(3, 4)$: Verificăm dacă $d[3] + w[3][4] < d[4]$ (adică $-3 - 1 < +∞
d[4] = -3 - 1 = -4$
* $p[4] = 3$
* $(4, 2)$: Verificăm dacă $d[4] + w[4][2] < d[2]$ (adică $-4 + 1 < -1
d[2] = -3 + 1 = -2$
* $p[2] = 4$
* $(4, 5)$: Verificăm dacă $d[4] + w[4][5] < d[2]$ (adică $-3 + 1 < +∞
d[5] = -3 + 1 = -2$
* $p[5] = 4
(1, 2)$: Verificăm dacă $d[1] + w[1][2] < d[2]$ (adică $0 - 1 < -2
(1, 3)$: Verificăm dacă $d[1] + w[1][3] < d[3]$ (adică $0 - 2 < -3
(2, 3)$: Verificăm dacă $d[2] + w[2][3] < d[3]$ (adică $-2 - 2 < -2
d[3] = -2 -2 = -4$
* $p[3] = 2$
* $(3, 4)$: Verificăm dacă $d[3] + w[3][4] < d[4]$ (adică $-4 - 1 < -4
d[4] = -4 - 1 = -5$
* $p[4] = 3$
* $(4, 2)$: Verificăm dacă $d[4] + w[4][2] < d[2]$ (adică $-5 + 1 < -2
d[2] = -5 + 1 = -4$
* $p[2] = 4$
* $(4, 5)$: Verificăm dacă $d[4] + w[4][5] < d[2]$ (adică $-5 + 1 < -2
d[5] = -5 + 1 = -4$
* $p[5] = 4
(1, 2)$: Verificăm dacă $d[1] + w[1][2] < d[2]$ (adică $0 - 1 < -4
(1, 3)$: Verificăm dacă $d[1] + w[1][3] < d[3]$ (adică $0 - 2 < -4
(2, 3)$: Verificăm dacă $d[2] + w[2][3] < d[3]$ (adică $-4 - 2 < -4
d[3] = -4 -2 = -6$
* $p[3] = 2$
* $(3, 4)$: Verificăm dacă $d[3] + w[3][4] < d[4]$ (adică $-6 - 1 < -5
d[4] = -6 - 1 = -7$
* $p[4] = 3$
* $(4, 2)$: Verificăm dacă $d[4] + w[4][2] < d[2]$ (adică $-7 + 1 < -4
d[2] = -7 + 1 = -6$
* $p[2] = 4$
* $(4, 5)$: Verificăm dacă $d[4] + w[4][5] < d[2]$ (adică $-7 + 1 < -4
d[5] = -7 + 1 = -6$
* $p[5] = 4
(1, 2)$: Verificăm dacă $d[1] + w[1][2] < d[2]$ (adică $0 - 1 < -6
(1, 3)$: Verificăm dacă $d[1] + w[1][3] < d[3]$ (adică $0 - 2 < -6
(2, 3)$: Verificăm dacă $d[2] + w[2][3] < d[3]$ (adică $-6 - 2 < -6
T = O(n * m)\ sau\ O(|V| * |E|)
S = O(1)
d$ / $p
d[node]$ nu a fost schimbată la un pas, folosirea muchiilor care pornesc din $node
O(n * m * log n)$ / $O(n^2 * m)
n - 1
n ⇐ 50.000 $
* $ m ⇐ 2.5 * 10^5 $
* $ 0 ⇐ c ⇐ 20.000
d[node]
d[source] = 0
d[node] = -1
d[0]
p
p[node]
p[source] = 0
p[node] = 0$ - nodul $node$ nu este accesibil din $source
n ⇐ 50.000
path = (source, …, destination)
n - 1$ noduri din graf. Se va folosi aceeași convenție de reprezentare a vectorului de distanțe $d
n ⇐ 50.000 $
* $ m ⇐ 2.5 * 10^5 $
* $ -1000 ⇐ c ⇐ +1000$, unde c este costul/lungimea unui arc* 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.