Documente Academic
Documente Profesional
Documente Cultură
Martie, 7, 2019
1 / 50
Conţinut
2 / 50
Reprezentarea / memorarea grafurilor
3 / 50
Reprezentarea / memorarea grafurilor
Reprezentări (II)
sau când trebuie să stabilim rapid dacă o muchie (sau un arc) leagă
două vârfuri
4 / 50
Reprezentarea / memorarea grafurilor Lista de adiacenta
Listă de adiacenţă
Matrice de adiacenţă
6 / 50
Reprezentarea / memorarea grafurilor Matrice de adiacenta
7 / 50
Reprezentarea / memorarea grafurilor Matrice de adiacenta
Matrice de incidenţă
matrice de incidenţă
matricea de incidenţă pentru un graf simplu orientat G = (V , E ) este o
matrice, B = (bij ), de dimensiunea |V |x |E | unde
1,
∃j ∈ V |e = {i, j},
bij = −1, ∃j ∈ V |e = {j, i}, i ∈ V , e ∈ E
0, altfel
E fiind sortată.
8 / 50
Reprezentarea / memorarea grafurilor Exemple
1 2
5 4
9 / 50
Reprezentarea / memorarea grafurilor Exemple
0 1 0 0 1
1 0 1 1 1
A= 0 1 0 1 0
0 1 1 0 1
1 2 5 /
1 1 0 1 0
2 1 5 3 4 /
3 2 4 /
4 2 5 3 /
5 4 1 2 /
10 / 50
Reprezentarea / memorarea grafurilor Exemple
1 2 3
4 5 6
11 / 50
Reprezentarea / memorarea grafurilor Exemple
1 2 4 /
2 5 /
3 6 5 /
4 2 /
5 4 /
0 1 0 1 0 0
0 0 0 0 1 0
6 6 /
0 0 0 0 1 1
A=
0 1 0 0 0 0
0 0 0 1 0 0
0 0 0 0 0 1
12 / 50
Reprezentarea / memorarea grafurilor Exemple
6
2 4
1 3 4 5
1 1 −1 0 0 0
1 3 5
−1 0 1 1 0 −1
2 B=
0 −1 0 −1 0 0
0 0 0 0 1 1
0 0 0 0 −1 0
13 / 50
Parcurgeri in latime si adancime Parcurgere in latime
BFS (II)
15 / 50
Parcurgeri in latime si adancime Parcurgere in latime
BFS (III)
16 / 50
Parcurgeri in latime si adancime Parcurgere in latime
BFS
Exemplu
18 / 50
Parcurgeri in latime si adancime Parcurgere in latime
BFS
Lema
fie G = (V , E ) un graf orientat sau neorientat și s ∈ V un vârf ales
arbitrar. Pentru oricare arc / muchie {u, v } ∈ E
δ(s, v ) ≤ δ(s, u) + 1.
20 / 50
Parcurgeri in latime si adancime Parcurgere in latime
Lema
fie G = (V , E ) un graf orientat sau neorientat și BFS e rulat pe G din
nodul sursă s ∈ V . După ce a terminat BFS, pentru fiecare v ∈ V ,
valoarea v .d calculată de BFS satisface
v .d ≥ δ(s, v ).
Lema
dacă în timpul execuţiei BFS pe un graf G = (V , E ) coada Q conţine
vârfurile {v1 , v2 , ..., vr }, unde v1 este în vârful cozii și vr este vârful din
coada. vr .d ≤ v1 .d + 1 și vi .d ≤ vi+1 .d pentru i = 1, 2, ..., r − 1.
21 / 50
Parcurgeri in latime si adancime Parcurgere in latime
Corolar
fie vârfurile vi și vj introduse în coadă pe parcursul execuţiei BFS, vârful vi
este prelucrat înaintea lui vj . Atunci vi .d ≤ vj .d în momentul în care vj
este prelucrat.
22 / 50
Parcurgeri in latime si adancime Parcurgere in adancime
23 / 50
Parcurgeri in latime si adancime Parcurgere in adancime
DFS (II)
Exemplu
algoritmul colorează vârfurile pe parcursul căutării similar cu BFS,
prin culoare se indică starea nodului
pe lângă stare DFS marchează și timpul când a fost descoperit vârful
și timpul când a fost explorat complet arborele din vârful descoperit
pentru a masura performanţa algoritmului
pentru a descoperi structura grafului
u.d marchează timpul când a fost descoperit vârful u
u.f marchează timpul când a fost explorat vârful u
starea unui vârf: alb - u.d - gri - u.f - negru
24 / 50
Parcurgeri in latime si adancime Parcurgere in adancime
DFS - procedura
DFS(G)
for fiecare vârf u ∈ G.V do
u.color = alb
u.π = NIL
end for
time = 0
for fiecare u ∈ G.V do
if u.color == alb then
DFS_VISIT(G,u)
end if
end for
25 / 50
Parcurgeri in latime si adancime Parcurgere in adancime
DFS_VISIT(G, u)
time = time + 1
u.d = time
u.color = gri
for fiecare v ∈ G.Adj[u] do
if v.color == alb then
v .π = u
DFS_VISIT(G,v)
end if
end for
u.color = negru
time = time + 1
u.f = time
26 / 50
Parcurgeri in latime si adancime Parcurgere in adancime
DFS
Exemplu
27 / 50
Parcurgeri in latime si adancime Parcurgere in adancime
DFS
Exemplu - click
28 / 50
Parcurgeri in latime si adancime Parcurgere in adancime
DFS - proprietăţi
Teoremă
fie G = (V , E ) un graf orientat sau neorientat, în DFS pentru oricare
noduri u și v una din următoarele condiţii este adevărată:
intervalele [u.d, u.f ] și [v .d, v .f ] sunt disjuncte, u și v nu sunt
descendenţi unul altuia
intervalul [u.d, u.f ] este inclus [v .d, v .f ], u este un descendent al lui v
intervalul [v .d, v .f ] este inclus in [u.d, u.f ] și v este un descendent al
lui u
29 / 50
Parcurgeri in latime si adancime Exemple
Exemple
30 / 50
Parcurgeri in latime si adancime Exemple
Exemple
31 / 50
Parcurgeri in latime si adancime Exemple
Exemple (II)
32 / 50
Parcurgeri in latime si adancime Exemple
Exemple (II)
33 / 50
Parcurgeri in latime si adancime Exemple
34 / 50
Parcurgeri in latime si adancime Exemple
35 / 50
Parcurgeri in latime si adancime Exemple
graf tare conex - prin oricare două vârfuri trece cel puţin un circuit
36 / 50
Parcurgeri in latime si adancime Exemple
Exemplu
37 / 50
Parcurgeri in latime si adancime Exemple
Exemplu DFS
38 / 50
Parcurgeri in latime si adancime Kosaraju
39 / 50
Cel mai scurt drum
40 / 50
Cel mai scurt drum
Moore(G, u)
1. l(u) := 0
2. for toate vârfurile v ∈ V (G), v 6= u do
3. l(v ) := ∞
4. Q = ∅
5. u → Q
6. while Q 6= ∅ do
7. Q→x
8. for toţi vecinii y ∈ N(x ) do
9. if l(y ) = ∞ then
10. p(y ) := x
11. l(y ) := l(x ) + 1
12. y →Q
13. return l, p
41 / 50
Cel mai scurt drum
Moore_drum(l, p, v )
1. k := l(v )
2. uk := v
3. while k 6= 0 do
4. uk−1 := p(uk )
5. k := k − 1
6. return u
42 / 50
Cel mai scurt drum
Exemplu
43 / 50
Algoritmul lui Dijkstra
Dijkstra
Dijkstra(G, u)
1. S := {u}, T := V \ S, l(u) := 0
2. for fiecare v ∈ V , v 6= u do
3. l(v ) := ∞
4. x := u
5. while T 6= ∅ do
6. for fiecare v ∈ N(x ) ∩ T do
7. if l(v ) > l(x ) + W(x , v ) then
8. l(v ) := l(x ) + W(x , v )
9. p(v ) := x
10. fie x ∈ T : l(x ) = min l(y )
y ∈T
11. S := S ∪ {x }, T := T \ {x }
12. return l, p
44 / 50
Algoritmul lui Dijkstra
Exemplu
45 / 50
Algoritmul lui Dijkstra
Exemplu (II)
46 / 50
Algoritmul lui Dijkstra
Exemplu (III)
47 / 50
Algoritmul lui Dijkstra
Exemplu (IV)
48 / 50
Algoritmul lui Dijkstra
Exemplu (V)
49 / 50