Descărcați ca pdf sau txt
Descărcați ca pdf sau txt
Sunteți pe pagina 1din 39

Drumuri in grafuri

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,vV.
• Secvenţa de vîrfuri : u0, u1, ..., un este un u-v drum dacă u0=u, un=v,
uiui+1E, 0 ≤ i ≤ n.
v2 v6 v7

v1 v4 v5 v8 v10

v3 v9
Fig.1 V1-V10 drum

Drum simplu – fiecare muchie apare o singura data


Lungimea drumului, notată l( ) este egală cu n.
Convenţional se numeşte drum trivial un drum  cu l()=0.
Pentru drumul din figura, l( ) = ? R: l() = 8
Drumuri in graf
• Fie : u0, u1, ..., un un drum în graful G=(V,E).  este un
drum închis dacă u0=un; în caz contrar  se numeşte
drum deschis.

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.

• Observaţie: Într-un graf neorientat noţiunile de circuit şi ciclu


sunt echivalente.

Exemplu Ciclu elementar/neelementar?


a) 3,4,5,3,7,6,1,2,3
b) 2,3,7,6,1,2
Raspuns:
a) ciclu neelementar
b) ciclu elementar
Drumuri in graf
• Exercitiu: fie graful neorientat

Dati exemple de cicluri elementare si neelementare care sa respecte conditiile:


- sa se plece din varful 5
- sa se treaca prin varful 3
Drumuri in graf
Raspuns (exemple de cicluri care sa respecte
conditiile impuse):
• ciclu elementar: 5,1,4,3,6,7,5
• ciclu neelementar: 5,2,7,1,4,3,6,7,5
Drumuri in graf
Rezumat:
• drum într-un graf: o mulţime ordonată de noduri ale grafului: (x1, x2, ..., xk), cu
proprietatea că există în graf toate arcele de forma (xi,xi+1) i = 1,...,k-1;
• lungimea unui drum: este numărul arcelor care îl formează;
• drum elementar: un drum în care fiecare nod apare o singură dată;
• drum simplu: un drum în care fiecare arc apare o singură dată;
• drum hamiltonian: un drum elementar care trece prin toate nodurile grafului;
• drum eulerian: un drum simplu care conţine toate arcele grafului;
• lanţ: un drum în care arcele nu au neapărat acelaşi sens de parcurgere;

• circuit: un drum în care nodul iniţial coincide cu cel final;


• circuit elementar: un drum în care fiecare nod apare o singură dată, cu excepţia
celui final, care coincide cu cel iniţial;
• circuit simplu: un drum în care fiecare arc apare o singură dată;
• circuit hamiltonian: un circuit care trece prin toate nodurile grafului;
• ciclu: este un circuit în care arcele nu au neapărat acelaşi sens de parcurgere;
• ciclu elementar: un ciclu în care fiecare nod apare o singură dată, cu excepţia celui
final, care coincide cu cel iniţial;
• ciclu simplu: un ciclu în care fiecare arc apare o singură dată;

Observaţie: Într-un graf neorientat noţiunile de drum şi lanţ sunt echivalente şi de


asemenea cele de circuit şi ciclu.
Matricea existenței drumurilor
Matricea existenței drumurilor
• Fie G=(V,E) un graf, A matricea de adiacenţă. Ap indică numărul de drumuri distincte
între oricare 2 vîrfuri.

• Fie operaţiile binare de adunare şi înmulţire.


Notînd 𝐴 = (𝑎𝑖𝑗 ), 𝐵 = (𝑏𝑖𝑗 ),
C = 𝐴⨁𝐵 = (𝑐𝑖𝑗 ),
D = 𝐴⨂𝐵 = (𝑑𝑖𝑗 ),

𝑐𝑖𝑗 = max 𝑎𝑖𝑗 , 𝑏𝑖𝑗


1 ≤ 𝑖,𝑗 ≤ 𝑛
𝑑𝑖𝑗 = max min *𝑎𝑖𝑘 , 𝑏𝑘𝑗 +
1 ≤ 𝑖,𝑗 ≤ 𝑛 1 ≤ 𝑘 ≤ 𝑛

𝐴𝑝 indică existența unui drum de lungime p între oricare 2 vîrfuri.

• 𝑀 = 𝐴1 ⨂𝐴2 ⨂ … ⨂𝐴𝑛−1 - matricea existenței drumurilor în graful G (se fol. algebra


booleana)

• M permite verificarea proprietatii de conexitate a grafului.


Toate elementele lui M sunt 1 => Graf conex
0 , dacă nu există vi  v j drum în G
1  i , j  n , mij  
1, altfel
Matricea existenței drumurilor
• Exemplu 1
Nr. vf: 4
2 A = matrice de adiacenta
1

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;

m = new unsigned char*[n];


for(i=0;i<n;i++)
m[i] = new unsigned char[n];

for( i=0; i<n; i++ )


for( j=0; j<n; j++ )
m[i][j] = a[i][j];

for( j=0; j<n; j++ ) 1


for( i=0; i<n; i++ )
if( m[i][j] )
for( k=0; k<n; k++ )
if( m[i][k] < m[k][j] )
m[i][k] = m[k][j];
return m;
}
0
Componente conexe
ale unui graf
Componente conexe ale unui graf
• Fie G=(V,E) graf netrivial. Vîrfurile u,v sînt
conectate dacă există un u-v drum în G.

• Dacă G este un graf, atunci o componentă conexă


a lui G este un subgraf conex al lui G, maximal în
raport cu proprietatea de conexitate.

• Un graf este conex dacă şi numai dacă numărul


componentelor sale conexe este 1.
Componente conexe ale unui graf
• Algoritm pentru determinarea unei componente conexe

– I: 𝑢0 , 𝐺, 𝑛
– E: 𝐶 = (𝑉𝑐 , 𝐸𝑐 )

– Se iniţializează componenta vidă 𝑉𝑐 = ∅, 𝐸𝑐 = ∅


– Se adaugă la mulţimea de vîrfuri vîrful iniţial 𝑉𝑐 = 𝑉𝑐 ∪ 𝑢0
– Repetă
• Se caută toţi vecinii noi ai vîrfurilor din 𝑉𝑐 şi se adaugă la mulţimea
de vîrfuri
• Se caută toate muchiile noi dintre vîrfurile din 𝑉𝑐 şi se adaugă la
mulţimea de muchii 𝐸𝑐
– Pînă cînd nu se mai găsesc vîrfuri noi Parcurgere
în adîncime / lățimeDin matricea
existenței
drumurilor

• Se determină mulțimea vîrfurilor conectate cu 𝑢0 → 𝑉𝑐


• Se adaugă la 𝐸𝑐 toate muchiile dintre vîrfurile din 𝑉𝑐 → 𝐸𝑐

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

Aplicarea algoritmului descris pentru v0=1, determină următoarea evoluţie:


I Vi Ei
i=0 {1} Ø
i=1 {1,2,4} {(1,2),(1,4)}
i=2 {1,2,4,7,8,5} {(1,2),(1,4),(2,7),(2,8),(7,8),(4,5),(4,7),(5,8)}
Componente conexe ale unui graf
Exercitiu
Fie graful,
1 8

3
2

6
4 9 10

11
5 7

a) cate componente conexe are graful ?


b) determinaţi componenta conexă care conţine vârful 5
Componente conexe ale unui graf
• Raspuns: 1 8

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

• Pentru orice u şi v vîrfuri conectate în G, u ≠ v, w - distanţa între u şi v, notată D(u,v),


este definită prin

𝐷 𝑢, 𝑣 = 𝑚𝑖𝑛 𝐿 Γ , Γ ∈ 𝐷𝑢𝑣

unde Duv desemnează mulţimea tuturor u-v drumurilor elementare din G.

• Drumul pentru care D(u,v)=L(), se numeşte drum de cost minim.

• Algoritmi:
• Dijkstra
• Roy-Floyd
• Yen
Algoritmul Dijkstra
Algoritm

• fie 𝑮 = 𝑽, 𝑬, 𝑾 , 𝒖𝟎 𝒏𝒐𝒅 𝒊𝒏𝒊𝒕𝒊𝒂𝒍 ∈ 𝑽, graf conex


• etichete pentru fiecare vîrf 𝒗 ∈ 𝑽 : ( 𝑳 𝒗 , 𝒑 𝒗 )

• 𝑨 = 𝒖𝟎
• 𝑩=𝑽−𝑨
• 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

Pe baza matricii obtinute se extrag rutele pentru varfurile date.

Rezultat: pentru un drum de la 1 la 4:


- cost minim: 6
- traseul: 1-2-3-4
Algoritmul Roy - Floyd
void Roy_Floyd (float w[10][10], unsigned n
float d[10][10], float MAX)
{ int i,j,k;
for (i=0;i<n;i++)
for (j=0;j<n;j++)
d[i][j] = w[i][j];

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

S-ar putea să vă placă și