Documente Academic
Documente Profesional
Documente Cultură
0 V
1 2 2
1 2 3 4 5 6
3 2 d[V] 0 2 5 6 +∞ 3
3 S 1 2
6 5 3
4 Q 6 3 4
7
3 5
5
3 4 2
∞
6
Drumuri punct – multipunct
Algoritmul lui Dijkstra
•Exemplu: La următorul pas se selectează nodul 6 care are d[6]=3. Pe baza lui se modifică drumul
spre nodul 5 către care există drum direct din nodul 6, astfel:
0 V
1 2 2
1 2 3 4 5 6
3 2 d[V] 0 2 5 6 10 3
3 S 1 2 6
6 5 3
4 Q 3 4 5
7
3 5
5
3 4 2
10
6
Drumuri punct – multipunct
Algoritmul lui Dijkstra
•Exemplu: La următorul pas se selectează nodul 3 care are d[3]=5. Pe baza lui se verifică dacă
drumul spre nodul 4 poate fi relaxat, astfel d[3]+w(3,4)=7>d[4]=6, deci nu se modifică nimic, se
marchează nodul 3 ca vizitat.
0 V
1 2 2
1 2 3 4 5 6
3 2 d[V] 0 2 5 6 10 3
3 S 1 2 6 3
6 5 3
4 Q 4 5
7
3 5
5
3 4 2
10
6
Drumuri punct – multipunct
Algoritmul lui Dijkstra
•Exemplu: La următorul pas se selectează nodul 4 care are d[4]=6. Pe baza lui se verifică dacă
drumul spre nodul 5 poate fi relaxat, astfel d[4]+w(4,5)=9<d[5]=10, deci se modifică drumul
estimat pentru nodul 5 și se marchează nodul 4 ca vizitat.
0 V
1 2 2
1 2 3 4 5 6
3 2 d[V] 0 2 5 6 9 3
3 S 1 2 6 3 4
6 5 3
4 Q 5
7
3 5
5
3 4 2
9
6
Drumuri punct – multipunct
Algoritmul lui Dijkstra
•Exemplu: La următorul pas se selectează nodul 5 care are d[5]=9. Pe baza lui se verifică dacă
drumul spre nodul 2 poate fi relaxat, astfel d[5]+w(5,2)=14>d[2]=2, deci nu se modifică drumul
estimat pentru nodul 2 și se marchează nodul 5 ca vizitat.
0 V
1 2 2
1 2 3 4 5 6
3 2 d[V] 0 2 5 6 9 3
3 S 1 2 6 3 4 5
6 5 3
4 Q
7 • Algoritmul se încheie pentru că în coada Q nu se mai găsește nici un
3 5 nod nevizitat.
5
4 2 • Pentru a putea determina și muchiile din care este alcătuit drumul
9 3
minim pentru fiecare nod, este necesar să reținem un vector de
6 părinți P, pentru nodurile care au muchie directă cu nodul sursă,
P[nod] se inițializează cu sursa, iar pentru restul cu 0.
Drumuri punct – multipunct
Algoritmul lui Dijkstra
DIJKSTRA(sursa, dest) // relaxari succesive // gasirea drumului efectiv
selectat(sursa) = true UNTIL Q nu e vida Initializeaza Drum = {}
FOREACH nod in V u = extrage_min (Q) nod = P[dest]
// V = multimea nodurilor selectat(u) = true UNTIL nod != null
IF exista muchie[sursa, nod] THEN FOREACH nod in vecini[u] // (*) insereaza nod la inceputul lui Drum
// initializam distanta pana la nodul respectiv /* daca drumul de la sursa la nod prin u este mai mic decat cel curent */ nod = P[nod]
d[nod] = w[sursa, nod] introdu nod in Q IF not selectat(nod) AND d[nod] > d[u] + w[u, nod] THEN
// parintele nodului devine sursa // actualizeaza distanta si parinte
P[nod] = sursa d[nod] = d[u] + w[u, nod]
ELSE d[nod] = +∞ // distanta infinita P[nod] = u
P[nod] = null // nu are parinte /* actualizeaza pozitia nodului in coada prioritara */
ENDIF actualizeaza (Q,nod)
ENDFOR ENDIF
ENDFOR
Drumuri punct – multipunct
Algoritmul Bellman-Ford
•Algoritmul Bellman Ford poate fi folosit si pentru grafuri ce conțin muchii de cost negative.
•Nu poate fi folosit pentru grafuri ce conțin cicluri de cost negativ.
•Algoritmul folosește același mecanism de relaxare ca si Dijkstra, dar, spre deosebire de acesta,
nu optimizează o soluție folosind un criteriu de optim local, ci parcurge fiecare muchie de un
număr de ori egal cu numărul de noduri si încearcă sa o relaxeze de fiecare data, pentru a
îmbunătăți distanta până la nodul destinație al muchiei curente.
•Motivul pentru care se face acest lucru este ca drumul minim dintre sursa si orice nod destinație
poate sa treacă prin maximum |V| noduri
•Relaxarea tuturor muchiilor de |V|- 1 ori este suficienta pentru a propaga până la toate nodurile
informația despre distanta minima de la sursa.
•Daca, la sfârșitul acestor relaxări, mai poate fi îmbunătățită o distanță, atunci graful are un ciclu
de cost negativ si problema nu are soluție.
Drumuri punct – multipunct
Algoritmul Bellman-Ford
• Numărul de noduri: 6
2 -1 • Numărul de iterații de relaxare : 5
6 5 • Muchii în graf: (1,2), (1,3), (1,4), (2,5), (3,5), (4,3), (4,6), (5,6), (3,2)
-2 3
Pasul 1: Inițializarea. Se alege nodul sursă, pentru care avem d[s]=0,
1 4 3
iar pentru celelalte noduri se inițializează cu ∞.
3
5 -2 6
4 -1
Drumuri punct – multipunct
Algoritmul Bellman-Ford
∞
• Numărul de noduri: 6
2 -1 ∞ • Numărul de iterații de relaxare: 5
6 5 • Muchii în graf: (1,2), (1,3), (1,4), (2,5), (3,5), (4,3), (4,6), (5,6), (3,2)
-2 3
Pasul 1: Inițializarea. Se alege nodul sursă, pentru care avem d[s]=0,
0 1 4 3
iar pentru celelalte noduri se inițializează cu ∞. Se alege nodul
3 sursă nodul 1.
∞
5 -2 6
∞ Pasul 2. Prima iterație, se verifică pentru fiecare muchie dacă
4 -1 aceasta poate fi relaxată cu ajutorul regulii de relaxare:
∞
if( d[u] + w(u,v) < d[v] )
d[v] = d[u] + w(u,v)
Drumuri punct – multipunct
Algoritmul Bellman-Ford
∞6 Pentru muchia (1,2) avem:
d[1]+w(1,2) = 0+6=6 < ∞ = d[2], deci muchia (1,2) poate fi relaxată,
2 -1 ∞ astfel avem d[2]=6.
6 5
-2 3
0 1 4 3
3
∞
5 -2 6
∞
4 -1
∞
Drumuri punct – multipunct
Algoritmul Bellman-Ford
∞6 Pentru muchia (1,2) avem:
d[1]+w(1,2) = 0+6=6 < ∞ = d[2], deci muchia (1,2) poate fi relaxată,
2 -1 ∞ astfel avem d[2]=6.
6 5
-2 3
0 1 4 3
3
∞
5 -2 6
∞
4 -1
∞
Drumuri punct – multipunct
Algoritmul Bellman-Ford
∞6 Se iau pe rând muchiile și se evaluează principiul relaxării.
Pentru muchia (1,2) avem:
2 -1 ∞ d[1]+w(1,2) = 0+6=6 < ∞ = d[2], deci muchia (1,2) poate fi relaxată,
6 5 astfel avem d[2]=6.
-2 3 Pentru muchia (1,3) avem:
0 1 3 d[1]+w(1,3) = 0+4 = 4 < ∞ = d[3], deci muchia (1,3) poate fi relaxată,
4
3 astfel avem d[3]=4.
∞4
5 -2 6
∞
4 -1
∞
Drumuri punct – multipunct
Algoritmul Bellman-Ford
∞6 Se iau pe rând muchiile și se evaluează principiul relaxării.
Pentru muchia (1,2) avem:
2 -1 ∞ d[1]+w(1,2) = 0+6=6 < ∞ = d[2], deci muchia (1,2) poate fi relaxată,
6 5 astfel avem d[2]=6.
-2 3 Pentru muchia (1,3) avem:
0 1 3 d[1]+w(1,3) = 0+4 = 4 < ∞ = d[3], deci muchia (1,3) poate fi relaxată,
4
3 astfel avem d[3]=4.
∞4
5 -2 6
∞
4 -1
∞
Drumuri punct – multipunct
Algoritmul Bellman-Ford
∞6 Se iau pe rând muchiile și se evaluează principiul relaxării.
Pentru muchia (1,2) avem:
2 -1 ∞ d[1]+w(1,2) = 0+6=6 < ∞ = d[2], deci muchia (1,2) poate fi relaxată,
6 5 astfel avem d[2]=6.
-2 3 Pentru muchia (1,3) avem:
0 1 3 d[1]+w(1,3) = 0+4 = 4 < ∞ = d[3], deci muchia (1,3) poate fi relaxată,
4
3 astfel avem d[3]=4.
∞4 Pentru muchia (1,4) avem:
5 -2 6 d[1]+w(1,4) = 0+5 = 5 < ∞ = d[4], deci muchia (1,4) poate fi relaxată,
∞
astfel avem d[4]=5.
4 -1
∞ 5
Drumuri punct – multipunct
Algoritmul Bellman-Ford
∞6 Se iau pe rând muchiile și se evaluează principiul relaxării.
Pentru muchia (1,2) avem:
2 -1 ∞ d[1]+w(1,2) = 0+6=6 < ∞ = d[2], deci muchia (1,2) poate fi relaxată,
6 5 astfel avem d[2]=6.
-2 3 Pentru muchia (1,3) avem:
0 1 3 d[1]+w(1,3) = 0+4 = 4 < ∞ = d[3], deci muchia (1,3) poate fi relaxată,
4
3 astfel avem d[3]=4.
∞4 Pentru muchia (1,4) avem:
5 -2 6 d[1]+w(1,4) = 0+5 = 5 < ∞ = d[4], deci muchia (1,4) poate fi relaxată,
∞
astfel avem d[4]=5.
4 -1
∞ 5
Drumuri punct – multipunct
Algoritmul Bellman-Ford
∞6 Se iau pe rând muchiile și se evaluează principiul relaxării.
Pentru muchia (1,2) avem:
2 -1 ∞5 d[1]+w(1,2) = 0+6=6 < ∞ = d[2], deci muchia (1,2) poate fi relaxată,
6 5 astfel avem d[2]=6.
-2 3 Pentru muchia (1,3) avem:
0 1 3 d[1]+w(1,3) = 0+4 = 4 < ∞ = d[3], deci muchia (1,3) poate fi relaxată,
4
3 astfel avem d[3]=4.
∞4 Pentru muchia (1,4) avem:
5 -2 6 d[1]+w(1,4) = 0+5 = 5 < ∞ = d[4], deci muchia (1,4) poate fi relaxată,
∞
astfel avem d[4]=5.
4 -1
Pentru muchia (2,5) avem:
∞ 5 d[2]+w(2,5) = 6-1 = 5 < ∞ = d[5], deci muchia (2,5) poate fi relaxată,
astfel avem d[5]=5.
Drumuri punct – multipunct
Algoritmul Bellman-Ford
∞6 Se iau pe rând muchiile și se evaluează principiul relaxării.
Pentru muchia (1,2) avem:
2 -1 ∞5 d[1]+w(1,2) = 0+6=6 < ∞ = d[2], deci muchia (1,2) poate fi relaxată,
6 5 astfel avem d[2]=6.
-2 3 Pentru muchia (1,3) avem:
0 1 3 d[1]+w(1,3) = 0+4 = 4 < ∞ = d[3], deci muchia (1,3) poate fi relaxată,
4
3 astfel avem d[3]=4.
∞4 Pentru muchia (1,4) avem:
5 -2 6 d[1]+w(1,4) = 0+5 = 5 < ∞ = d[4], deci muchia (1,4) poate fi relaxată,
∞
astfel avem d[4]=5.
4 -1
Pentru muchia (2,5) avem:
∞ 5 d[2]+w(2,5) = 6-1 = 5 < ∞ = d[5], deci muchia (2,5) poate fi relaxată,
astfel avem d[5]=5.
Drumuri punct – multipunct
Algoritmul Bellman-Ford
∞6 Pentru muchia (3,5) avem:
d[3]+w(3,5) = 4+3=7 > 5 = d[5], deci muchia (3,5) nu poate fi relaxată.
2 -1 ∞5 Pentru muchia (4,3) avem:
6 5 d[4]+w(4,3) = 5-2=3 < 4 = d[3], deci muchia (4,3) poate fi relaxată,
-2 3 astfel avem d[3]=3.
0 1 4 3
3
∞43
5 -2 6
∞
4 -1
∞ 5
Drumuri punct – multipunct
Algoritmul Bellman-Ford
∞6 Pentru muchia (3,5) avem:
d[3]+w(3,5) = 4+3=7 > 5 = d[5], deci muchia (3,5) nu poate fi relaxată.
2 -1 ∞5 Pentru muchia (4,3) avem:
6 5 d[4]+w(4,3) = 5-2=3 < 4 = d[3], deci muchia (4,3) poate fi relaxată,
-2 3 astfel avem d[3]=3.
0 1 4 3
3
∞43
5 -2 6
∞
4 -1
∞ 5
Drumuri punct – multipunct
Algoritmul Bellman-Ford
∞6 Pentru muchia (3,5) avem:
d[3]+w(3,5) = 4+3=7 > 5 = d[5], deci muchia (3,5) nu poate fi relaxată.
2 -1 ∞5 Pentru muchia (4,3) avem:
6 5 d[4]+w(4,3) = 5-2=3 < 4 = d[3], deci muchia (4,3) poate fi relaxată,
-2 3 astfel avem d[3]=3.
0 1 3 Pentru muchia (4,6) avem:
4
3 d[4]+w(4,6) = 5-1=4 < ∞ = d[6], deci muchia (4,6) poate fi relaxată,
∞43 astfel avem d[6]=4.
5 -2 6
∞ 4
4 -1
∞ 5
Drumuri punct – multipunct
Algoritmul Bellman-Ford
∞6 Pentru muchia (3,5) avem:
d[3]+w(3,5) = 4+3=7 > 5 = d[5], deci muchia (3,5) nu poate fi relaxată.
2 -1 ∞5 Pentru muchia (4,3) avem:
6 5 d[4]+w(4,3) = 5-2=3 < 4 = d[3], deci muchia (4,3) poate fi relaxată,
-2 3 astfel avem d[3]=3.
0 1 3 Pentru muchia (4,6) avem:
4
3 d[4]+w(4,6) = 5-1=4 < ∞ = d[6], deci muchia (4,6) poate fi relaxată,
∞43 astfel avem d[6]=4.
5 -2 6
∞ 4
4 -1
∞ 5
Drumuri punct – multipunct
Algoritmul Bellman-Ford
∞6 Pentru muchia (3,5) avem:
d[3]+w(3,5) = 4+3=7 > 5 = d[5], deci muchia (3,5) nu poate fi relaxată.
2 -1 ∞5 Pentru muchia (4,3) avem:
6 5 d[4]+w(4,3) = 5-2=3 < 4 = d[3], deci muchia (4,3) poate fi relaxată,
-2 3 astfel avem d[3]=3.
0 1 3 Pentru muchia (4,6) avem:
4
3 d[4]+w(4,6) = 5-1=4 < ∞ = d[6], deci muchia (4,6) poate fi relaxată,
∞43 astfel avem d[6]=4.
5 -2 6 Pentru muchia (5,6) avem:
∞ 4
d[5]+w(5,6) = 5+3=8 > 4 = d[6], deci muchia (5,6) nu poate fi relaxată.
4 -1
∞ 5
Drumuri punct – multipunct
Algoritmul Bellman-Ford
∞61 Pentru muchia (3,5) avem:
d[3]+w(3,5) = 4+3=7 > 5 = d[5], deci muchia (3,5) nu poate fi relaxată.
2 -1 ∞5 Pentru muchia (4,3) avem:
6 5 d[4]+w(4,3) = 5-2=3 < 4 = d[3], deci muchia (4,3) poate fi relaxată,
-2 3 astfel avem d[3]=3.
0 1 3 Pentru muchia (4,6) avem:
4
3 d[4]+w(4,6) = 5-1=4 < ∞ = d[6], deci muchia (4,6) poate fi relaxată,
∞43 astfel avem d[6]=4.
5 -2 6 Pentru muchia (5,6) avem:
∞ 4
d[5]+w(5,6) = 5+3=8 > 4 = d[6], deci muchia (5,6) nu poate fi relaxată.
4 -1
Pentru muchia (3,2) avem:
∞ 5 d[3]+w(3,2) = 3-2=1 < 6 = d[2], deci muchia (3,2) poate fi relaxată,
astfel avem d[2]=1.
Drumuri punct – multipunct
Algoritmul Bellman-Ford
∞61 Pentru muchia (3,5) avem:
d[3]+w(3,5) = 4+3=7 > 5 = d[5], deci muchia (3,5) nu poate fi relaxată.
2 -1 ∞5 Pentru muchia (4,3) avem:
6 5 d[4]+w(4,3) = 5-2=3 < 4 = d[3], deci muchia (4,3) poate fi relaxată,
-2 3 astfel avem d[3]=3.
0 1 3 Pentru muchia (4,6) avem:
4
3 d[4]+w(4,6) = 5-1=4 < ∞ = d[6], deci muchia (4,6) poate fi relaxată,
∞43 astfel avem d[6]=4.
5 -2 6 Pentru muchia (5,6) avem:
∞ 4
d[5]+w(5,6) = 5+3=8 > 4 = d[6], deci muchia (5,6) nu poate fi relaxată.
4 -1
Pentru muchia (3,2) avem:
∞ 5 d[3]+w(3,2) = 3-2=1 < 6 = d[2], deci muchia (3,2) poate fi relaxată,
astfel avem d[2]=1.
Drumuri punct – multipunct
Algoritmul Bellman-Ford
∞61 Pentru muchia (3,5) avem:
d[3]+w(3,5) = 4+3=7 > 5 = d[5], deci muchia (3,5) nu poate fi relaxată.
2 -1 ∞5 Pentru muchia (4,3) avem:
6 5 d[4]+w(4,3) = 5-2=3 < 4 = d[3], deci muchia (4,3) poate fi relaxată,
-2 3 astfel avem d[3]=3.
0 1 3 Pentru muchia (4,6) avem:
4
3 d[4]+w(4,6) = 5-1=4 < ∞ = d[6], deci muchia (4,6) poate fi relaxată,
∞43 astfel avem d[6]=4.
5 -2 6 Pentru muchia (5,6) avem:
∞ 4
d[5]+w(5,6) = 5+3=8 > 4 = d[6], deci muchia (5,6) nu poate fi relaxată.
4 -1
Pentru muchia (3,2) avem:
∞ 5 d[3]+w(3,2) = 3-2=1 < 6 = d[2], deci muchia (3,2) poate fi relaxată,
astfel avem d[2]=1.
Fie G=(V,E) este un graf fără cicluri cu cost negativ. Mulțimea nodurilor este V={1,2,...,n}, iar w:VxV→R o
funcție de cost a arcelor grafului, astfel încât w(i,i)=0 și w(i,j)=∞ dacă (𝑖, 𝑗) ∉ 𝐸. Notăm cu dk(i,j) costul
drumului i..j curent construit, astfel încât drumul trece exclusiv prin noduri intermediare din mulțimea
{1,2,...,k}.
d0(i,j)=w(i,j)
dk(i,j)=min{dk-1(i,j), dk-1(i,k)+dk-1(k,j)} pentru 0<k<=n.
Drumuri multipunct – multipunct
Algoritmul Floyd-Warshall
FloydWarshall(G):
n = |V|
int d[n, n]
FOREACH (i, j) IN (1..n,1..n) DO
d[i, j] = w[i,j] // costul muchiei, sau infinit
FOR k = 1 TO n DO
FOREACH (i,j) IN (1..n,1..n) DO
d[i, j] = min(d[i, j], d[i, k] + d[k, j])
Drumuri multipunct – multipunct
Algoritmul Floyd-Warshall
Pentru a determina drumul efectiv, nu doar costul acestuia, avem două variante:
1. Se retine o structura de părinți, similara cu cea de la Dijkstra, dar, bineînțeles, bidimensionala.
2. Se folosește divide et impera astfel:
- se caută un pivot k astfel încât cost[i][j] = cost[i][k] + cost[j][k]
- se apelează funcția recursiv pentru ambele drumuri → (i,k),(k,j)
- dacă pivotul nu poate fi găsit, afișăm i
- după terminarea funcției recursive afișăm configurația drumului