Documente Academic
Documente Profesional
Documente Cultură
ATP - Curs 11
ATP - Curs 11
Conexitate
Drumuri de cost minim
Drumuri in graf
• drum (sau lant pentru graf neorientat)
• drum trivial
• drum deschis
• drum inchis
• drum elementar
• subdrum
• ciclu
• ciclu elementar
Drumuri in graf
• Fie G=(V,E) un graf, u,vV.
• Secvenţa de vîrfuri : u0, u1, ..., un este un u-v drum dacă u0=u, un=v,
uiui+1E, 0 ≤ i ≤ n.
v2 v6 v7
v1 v4 v5 v8 v10
v3 v9
Fig.1 V1-V10 drum
v2 v6 v7
v1 v4 v5 v8 v10
v3 v9
Fig.2 Drum inchis
Drumuri in graf
• Drumul este elementar dacă oricare două vîrfuri din
sînt distincte, cu excepţia, eventual, a extremităţilor.
v2 v6 v7
v1 v4 v5 v8 v10
v3 v9
Fig.3 Exemplu de drum elementar
(contine doar varfuri distincte)
Drumuri in graf
• Fie : u0, u1, ..., un un drum în graful G=(V,E). ’: v0, v1,..,vm este un subdrum al
lui dacă ’ este un drum şi pentru orice j, 0 ≤ j ≤ m , există i, astfel încît ui = vj.
• Orice drum cu lungime cel puţin 1 conţine cel puţin un drum elementar cu
aceleaşi extremităţi.
v2 v6 v7
v1 v4 v5 v8 v10
v3 v9
Fie drumul : v1, v2, v4, v5, v3, v1, v2, v5, v6, v7, v8, v9, v5, v9, v8, v10
Atunci 1: v1, v2, v5, v9, v8, v10
2: v1, v2, v4, v5, v9, v8, v10
sînt v1-v10 subdrumuri elementare.
Drumuri in graf
• Exercitiu 1a: fie graful neorientat
Care dintre urmatoarele drumuri
sunt elementare si care nu?
Vf initial = 2
Vf. final = 6
2,4,5,1,6 Elementar
2,3,6 Elementar
2,1,6,1,5 Neelementar
2,4,5,7,5,1,6 Neelementar
Drumuri in graf
• Exercitiu 1b: fie graful neorientat
Care dintre urmatoarele drumuri
sunt elementare si care nu?
Vf initial = 2
Vf. final = 5
2,4,1,4,6,7,5 Nu e drum
2,4,1,6,1,7,5 Nu e drum
2,4,6,7,5,1,5 Nu e drum
2,5,4,7 Nu e drum
2,4,3,6,1,5 Elementar
Drumuri in graf
• Ciclu – drum (lant) cu V=v1, v2, .., vn , cu v1=vn si muchiile u1-u2, u2-u3,
un-1 – un sunt diferite doua cate doua.
• Ciclu elementar – ciclu in care toate varfurile sunt diferite doua cate
doua mai putin primul si ultimul. In caz contrar, el este neelementar.
0 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1
1 1 0 0 0 2 0 1 1 1 3 1 0 1 1 1 1 1 1
A A , A , A , M
1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1
1 0 1 0 1 1 1 1 1 1 1 1 1 1 1 1
Matricea existenței drumurilor
• Exemplu 2
22 55 0 1 1 0 0 0 1 1 1 1 0 0
1 0 1 0 0 0 1 1 1 1 0 0
1 1 0 1 0 0 1 1 1 0 0 0
66 𝐴 = 𝐴1 = 𝐴2 =
0 0 1 0 0 0 1 1 0 1 0 0
44
11 0 0 0 0 0 1 0 0 0 0 1 0
0 0 0 0 1 0 0 0 0 0 0 1
33
1 1 1 1 0 0 1 1 1 1 0 0 1 1 1 1 0 0
1 1 1 1 0 0 1 1 1 1 0 0 1 1 1 1 0 0
1 1 1 1 0 0 1 1 1 1 0 0 1 1 1 1 0 0
𝐴3 = 𝐴4 = 𝐴5 =
1 1 1 0 0 0 1 1 1 1 0 0 1 1 1 1 0 0
0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 1
0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 1 0
1 1 1 1 0 0 1 1 1 1 0 0
1 1 1 1 0 0 1 1 1 1 0 0
1 1 1 1 0 0 1 1 1 1 0 0
𝑀= 𝑀=
1 1 1 1 0 0 1 1 1 1 0 0
0 0 0 0 1 1 0 0 0 0 1 1
0 0 0 0 1 1 0 0 0 0 1 1
Algoritmul Roy – Warshall
(algoritm pentru det. matricei exist. drumurilor)
unsigned char ** Roy_Warshall (unsigned char **a,unsigned n)
{ int i,j,k;
unsigned char **m;
– I: 𝑢0 , 𝐺, 𝑛
– E: 𝐶 = (𝑉𝑐 , 𝐸𝑐 )
20
Componente conexe ale unui graf
Exemplu:
Pentru graful de mai jos, determinați componenta conexă care conține vârful 1.
1 7 3
2
4 5 8 9 6
3
2
6
4 9 10
11
5 7
3
2
6
4 9 10
11
5 7
a) 2 componente
b) pentru varful 5, evolutia este:
I Vi Ei
i=0 {5} Ø
i=1 {1,4,5} {(1,5),(4,5)}
i=2 {1,2,3,4,5,7} {(1,5),(4,5),(1,2),(1,3),(2,4),(3,4),(1,7),(4,7)}
i=3 {1,2,3,4,5,6,7} {(1,5),(4,5),(1,2),(1,3),(2,4),(3,4),(1,7),(4,7),(3,6),(6,7)}
Drumuri de cost minim
Drumuri de cost minim
• Fie G=(V,E,w) un graf ponderat. Costul drumului : u0, u1, ..., un , notat L( ), este definit
prin:
𝑛−1
𝐿 Γ = 𝑤(𝑢𝑖 , 𝑢𝑖+1 )
𝑖=0
𝐷 𝑢, 𝑣 = 𝑚𝑖𝑛 𝐿 Γ , Γ ∈ 𝐷𝑢𝑣
• Algoritmi:
• Dijkstra
• Roy-Floyd
• Yen
Algoritmul Dijkstra
Algoritm
• 𝑨 = 𝒖𝟎
• 𝑩=𝑽−𝑨
• pentru fiecare vîrf 𝒗 ∈ 𝑽, 𝑳 𝒗 = ∞
• 𝑳 𝒖𝟎 = 𝟎, 𝒑 𝒖𝟎 = −𝟏, 𝑨𝟏 =𝒖𝟎
• pentru 𝟏 ≤ 𝒊 < 𝒏
– pentru fiecare vîrf 𝒗 ∈ 𝑩
• dacă 𝑳 𝒗 > 𝑳 𝑨𝒊 + 𝐰(𝑨𝒊 , 𝒗)
– 𝑳 𝒗 = 𝑳 𝑨𝒊 + 𝐰(𝑨𝒊 , 𝒗)
– 𝒑 𝒗 = 𝑨𝒊
– determină un vîrf 𝒗 ∈ 𝑩 a.î. 𝑳 𝒗 este minimă
– 𝑨𝒊 = 𝒗
– 𝑨=𝑨∪ 𝒗
– 𝑩= 𝑩− 𝒗
∗ 𝒑 𝒗 − 𝒑𝒓𝒆𝒅𝒆𝒄𝒆𝒔𝒐𝒓𝒖𝒍 𝒗𝒇 − 𝒖𝒍𝒖𝒊 𝒗
Algoritmul Dijkstra (1)
Exemplu
Fie graful ponderat
1
5 1
2 9
3
16
2
5 5
4
Algoritmul Dijkstra (2)
Exemplu
Fie graful ponderat
1
5 1
2 9
3
16
2
5 5
4
• Implementare :
vezi suport
de curs
Algoritmul Dijkstra (3)
Exemplu Rezultate
Varf pana la care e 1 2 3 4 5
Fie graful ponderat calculata distanta
1
Dist(1,v), predecesorul lui v 0,1 5,1 1,1 7,2 12,4
5 1
2 9
3
Nr. vf. 1 2 3 4 5
16
2 Distanta 0 5 1 7 12
5 5
4 Predecesor -1 1 1 2 4
• Implementare :
vezi suport de curs
Algoritmul Roy - Floyd
• Istoric
– publicat sub forma cunoscută în prezent de către
Robert Floyd în 1962.
– asemănător algoritmului publicat de către
Bernard Roy în 1959.
• Aplicabilitate
– folosit în domenii diverse
– ex:
• stabilirea traseelor feroviare sau aeriene
• jocuri informatice
Algoritmul Roy - Floyd
• Determină costul minim al drumului dintre oricare două vârfuri
x, y, precum şi un astfel de drum.
• Iniţial se porneşte de la matricea costurilor C (distantelor) care va fi
transformată în matricea drumurilor de cost minim astfel:
– se consideră un vârf k (k=1,n) şi pentru fiecare k se compară costul
drumului, din acel moment, dintre i şi j (i,j=1,n), cu suma costurilor dintre
drumul (i,k)şi drumul (k,j);
– în cazul în care costul drumului (i,j) ce trece prin k este mai mic decât
drumul existent deja înseamnă că am găsit un nou drum de cost mai
mic între vârfurile i şi j, trecând prin k.
– În cazul acesta costul drumului de la i la j va fi suma costurilor drumului
de la i la k cu drumul de la k la j, iar tata[i][j] va fi tata[k][j] (se va
reactualiza şi vectorul tata pentru a putea reconstitui drumul minim).
• Determina
– matricea distantelor minime dintre varfurile grafului
– matricea drumurilor minime dintre nodurile grafului
Algoritmul Roy - Floyd
Exemplu
• Fie G=(V, E, w) un graf neorientat (n noduri si m muchii) memorat prin matricea
ponderilor. Se cere ca pentru doua noduri x,y citite sa se determine lungimea minima
a lantului de la x la y.
Matricea costurilor
0 2 ∞ 10 ∞
2 0 3 ∞ ∞
∞ 3 0 1 8
10 ∞ 1 0 ∞
∞ ∞ 8 ∞ 0
-Se incearca pentru oricare pereche de noduri i,j sa se obtina “drumuri” mai scurte prin
noduri intermediare k (k∈1...n).
- Acest lucru se determina comparand “lungimea” lantului a[i,j] cu lungimea lantului
care trece prin k si: daca a[i,j] > a[i,k]+a[k,j]
atunci se atribuie a[i,j] ←a[i,k]+a[k,j]
Algoritmul Roy - Floyd
for (j=0;j<n;j++)
for (i=0;i<n;i++)
if(d[i][j]<MAX)
for (k=0;k<n;k++)
if (d[i][k] > d[i][j] + d[j][k])
d[i][k] = d[i][j] + d[j][k];
}
Algoritmul Yen
Scop:
- de gasire a distantelor minime de la varful x1 la varfurile x2,xj,...,xn pentru
un graf
Algoritm:
• I: W, n, k
• E: b
• 𝑫←𝑾
• 𝒍 𝒊 = 𝟏, 𝟎 ≤ 𝒊 < 𝒏
• 𝒍 𝒌 − 𝟏 = 𝟎, 𝒃 𝒌 − 𝟏 = 𝟎
• pentru 𝟎 ≤ 𝒊 < 𝒏
– determină p a.î. 𝒍 𝒑 = 𝟏 și 𝒅 𝒌 − 𝟏, 𝒑 e minim
– 𝒃 𝒑 = 𝒅 𝒌 − 𝟏, 𝒑
– 𝒍 𝒑 =𝟎
– pentru 𝟎 ≤ 𝒋 < 𝒏
• 𝒅 𝒌 − 𝟏, 𝒋 = 𝒎𝒊𝒏( 𝒅 𝒌 − 𝟏, 𝒋 , 𝒅 𝒌 − 𝟏, 𝒑 + 𝒅 𝒑, 𝒋 )
Algoritmul Yen
• Exemplu
– Vf initial = 1 (vf1)
Algoritmul Yen
Rezultat:
𝑩 = (𝟎 𝟑 𝟐 𝟔 𝟑)
Vf initial = 1 (vf1)
Drum vf1->vf2 => cost1 = 3
cost2 = 2+5 = 7
cost3 = 7+4+5 = 16
cost4 = 4+1+5 = 10
=> se alege costul cel mai mic (3)
Drum vf1->vf3 => cost1 = 2
cost2 = 3+5 = 8
.....
Spor la invatat !
Referinte bibliografice
• ATP – suport de curs si seminar
• http://campion.edu.ro/arhiva/www/arhiva_2009/seds/17/index.htm
• http://software.ucv.ro/~cmihaescu/ro/teaching/ACA/docs/Roy-Floyd.pdf