Sunteți pe pagina 1din 28

Cursul 8

Tipuri de grafuri. Structuri de date pentru grafuri.


Conectivitate: Algoritmul naiv şi algoritmul lui Warshall

noiembrie 2016

Cursul 8
Reamintim că:
Graf = structură matematică G = (V , E ) unde
V : mulţime de noduri (sau vârfuri)
E : mulţime de muchii incidente la două noduri, sau la 1 nod
Tipuri de grafuri, ı̂n funcţie de tipul muchiilor e ∈ E :
I Neorientate: Fiecare muchie are 2 capete
e

a e b sau a (buclă)
Reprezenare grafică:
I Orientate (sau digrafuri): Fiecare muchie e ∈ E are o sursă (sau
start) şi o destinaţie (sau end)
e

a e b sau a (buclă)
Reprezentare grafică:
Muchiile orientate se numesc si arce (singular: arc).
Graf simplu: graf neorientat sau orientat, care are cel mult un arc ı̂ntre
orice două noduri şi nu are nici o buclă.
Cursul 8
Tipuri de grafuri frecvent ı̂ntâlnite
Taxonomie

G = (V , E )
e1 , e2 ∈ E sunt muchii paralele dacă sunt incidente la aceleaşi
noduri şi
Dacă G este orientat, atunci start(e1 ) = start(e2 ) şi
end(e1 ) = end(e2 )

I Multigraf orientat sau neorientat: nu are bucle, iar dacă


graful este
neorientat: poate avea muchii paralele
orientat: pooate avea arce paralele
I Pseudograf: graf neorientat care poate avea muchii paralele
şi bucle.
I Graf ponderat: fiecare muchie e ∈ E are o pondere (sau
greutate) w (E ); de obicei w (e) ∈ R.
Cursul 8
Reprezentări grafice ale grafurilor
Exemple

I Grafuri simple: se trasează linii sau săgeţi ı̂ntre nodurile


conectate
b c
Graf simplu neorientat: e
a d
b c
Graf simplu orientat: e
a d
I Grafuri simple ponderate: se indică ponderea ı̂n dreptul
conexiunilor
2
9
b c
12
3

a 5 1 f
4
7

1
e d
Cursul 8
Reprezentări grafice ale grafurilor
Exemple (continuare)

Multigrafuri sau pseudografuri: dacă au muchii paralele pe care


vrem să le distingem, se etichetăm muchiile:
e2 e4
a
e3
e1 c d
multigraf:
e5
b e6
e2 e4 e9
a
e3
e1 c d
pseudograf:
e5 e7
b e6
e8

Cursul 8
Reprezentări concrete ale grafurilor simple

1 Listă de noduri + listă de muchii


2 Liste de adiacenţă
3 Matrice de adiacenţă
4 Matrice de incidenţă
5 Matrice de ponderi

Cursul 8
Grafuri simple
Reprezentarea cu listă de noduri + listă de muchii

Exemplu
b c Listă de noduri V = [a, b, c, d, e]
Listă de muchii E = [{a, b}, {a, c}, {a, d}, {b, c}, {c, e}, {d, e}]
e Observaţii: {a, b} = {b, a}, {a, c} = {c, a}, etc.
a muchie ↔ mulţimea de noduri adiacente la muchie
d
b c Listă de noduri V = [a, b, c, d, e]
Listă de arce E = [(a, b), (c, a), (c, b), (d, a), (e, c), (e, d)]
e Observaţii: (a, b) 6= (b, a), (a, c) 6= (c, a), etc.
a muchie ↔ pereche (start,end)
d

Remarcă
Dacă nu există noduri izolate (cu 0 vecini), nu este necesar să fie
reţinută lista de noduri V :
I V se poate calcula din E

Cursul 8
Grafuri simple
Reprezentarea cu liste de adiacenţă

Pentru fiecare nod u ∈ V se reţine lista de noduri adiacente la u


I Dacă G este neorientat, v este adiacent la u dacă există o
muchie cu capetele u şi v .
În grafuri neorientate, relaţia de adiacenţă este simetrică.
I Dacă G este orientat, v este adiacent la u dacă există un arc
e ∈ E de la u la v , adică start(e) = u şi end(e) = v .

Exemplu
b c a 7→ [b, c, d] d 7→ [a, e]
b 7→ [a, c] e 7→ [c, d]
e c 7→ [a, b, e]
a d
b c a 7→ [b] d 7→ [a]
b 7→ [] e 7→ [c, d]
e c 7→ [a, b]
a d

Cursul 8
Grafuri
Reprezentarea cu matrice de adiacenţă AG

Dacă G are n noduri, AG = (mij ) are dimensiunea n × n şi


mij := numărul de muchii de la al i-lea nod la al j-lea nod.

Observaţii
1 Înainte de a construi MG din G , trebuie fixată o enumerare a
tuturor nodurilor: [v1 , v2 , . . . , vn ]
2 Dacă G este neorientat, AG este matrice simetrică
3 Dacă G este graf simplu, AG conţine doar 0 şi 1

Cursul 8
Grafuri neorientate
Matricea de adiacenţă AG a unui graf neorientat G

Matricea de adiacenţă a grafului neorientat

b c
G: e
a d
pentru enumerarea de noduri [a, b, c, d, e] este
 
0 1 1 1 0
1 0 1 0 0
 
AG = 1 1 0 0 1
1 0 0 0 1
0 0 1 1 0

Observaţie: AG este matrice simetrică.

Cursul 8
Grafuri
Digraful corespunzător unei matrici simetrice de adiacenţă

Dacă A este o matrice simetrică n × n cu aij ∈ N pentru toţi i, j, un


digraf G care are matricea de adiacenţă A se construieşte astfel:
1 Se desenează n puncte v1 , . . . , vn ı̂n plan
2 Pentru orice i, j ∈ {1, . . . , n} , se trasează aij muchii distincte
ı̂ntre vi şi vj

Exemplu
 
0 1 0 2 v2 v3
1 0 1 0

A= 0 ⇒G :
1 0 1
2 0 1 0 v1 v4

Cursul 8
Digrafuri
Matricea de adiacenţă AG a unui digraf G

Matricea de adiacenţă a grafului orientat

b c
G: e
a d
pentru enumerarea de noduri [a, b, c, d, e] este
 
0 1 0 0 0
0 0 0 0 0
 
AG = 1 1 0 0 0
1 0 0 0 0
0 0 1 1 0

Cursul 8
Digrafuri
Digraful corespunzător unei matrici de adiacenţă

Dacă A este o matrice n × n cu aij ∈ N pentru toţi i, j, un digraf G


care are matricea de adiacenţă A se construieşte astfel:
1 Se desenează n puncte v1 , . . . , vn ı̂n plan
2 Pentru orice i, j ∈ {1, . . . , n} , se trasează aij arce distincte de
la vi la vj

Exemplu

 
0 1 0 2 v2 v3
0 0 1 0

A=
0 ⇒G :
1 1 1
1 0 0 0 v1 v4

Cursul 8
Digrafuri cu muchii etichetate
Reprezentarea cu matrice de incidenţă

Presupunem date două liste (sau enumerări):


V = [v1 , . . . , vn ] a nodurilor lui G
L = [e1 , . . . , ep ] a etichetelor de muchii din G
 de incidenţă MG = (mij ) are dimensiunea n × p şi
Matricea
 −1 dacă start(ej ) = vi
mij = 1 dacă end(ej ) = vi
0 ı̂n toate celelalte cazuri.

Exemplu
Dacă V = [a, b, c, d, e], L = [e1 , e2 , e3 , e4 , e5 , e6 , e7 , e8 ] şi
−1 0 0 −1 1 0 0 −1
 b
e2
1 −1 0 0 0 1 0 0 e1
MG =  −1 −1 ⇒ e4
 0 1 1 0 0 0

a c

e6
e5
0 0 1 0 0 0 1 1 e8
−1 −1

e3
0 0 0 0 0 0
e e7 d

Cursul 8
Grafuri simple ponderate
Reprezentarea cu matrice de ponderi

Matricea de ponderi WG = (wij ) a unui graf simplu ponderat G cu


n noduri [v1 , . . . , vn ] are dimensiunea n × n şi
B wii = 0 pentru toţi 1 ≤ i ≤ n.
B wij = w ({vi , vj }) pentru orice muchie {vi , vj } ∈ E , dacă G
este neorientat.
B wij = w ((vi , vj )) pentru orice arc (vi , vj ) ∈ E , dacă G este
orientat.
B wij = ∞ ı̂n toate celelalte cazuri.

Exemplu (Digraf ponderat cu enumerare de noduri [a, b, c, d, e, f ])


2
9 0 3 ∞ ∞ 4 ∞
b c
3 ∞ 0 2 ∞ ∞ ∞
12

∞ 9 0 ∞ 1 12
G :a f ⇒ WG =
1

5  
4 ∞ ∞ ∞ 0 ∞ 7
7

1 ∞ 5 ∞ 1 0 ∞
e d ∞ ∞ ∞ ∞ ∞ 0

Cursul 8
Reprezentarea grafurilor
Studiu comparativ

I Reprezentarea cu listă de muchii


Adecvată pentru reprezentarea grafurilor simple fără noduri
izolate, cu |E |  |V |
Complexitate spaţială (memorie ocupată): O(|E |)
I Reprezentarea cu liste de adiacenţă
Permite enumerarea rapidă a vecinilor unui nod
Complexitate spaţială (memorie ocupată): O(|V | + |E |)
I Reprezentarea cu matrice de adiacenţă AG = (aij ) sau cu
matrice de ponderi WG = (wij )
Test rapid de conectivitate directă ı̂ntre 2 noduri: O(1)
@(vi , vj ) ∈ E dacă aij = 0 sau dacă wij = ∞
Complexitate spaţială (memorie ocupată): O(|V |2 )
- reprezentare neadecvată când |E |  |V |2
Reprezentare cu matrice de incidenţă MG
I Complexitate temporală: O(|V | · |E |)

Cursul 8
Digrafuri simple
Proprietăţi ale matricii de adiacenţă AG

Presupunem că G este (di)graf simplu cu n noduri şi matricea de


adiacenţă AG = (aij )
aij = 0 (sau false) dacă @ arc vi → vj
aij = 1 (sau true) dacă ∃ arc vi → vj
Definim:
In : matricea identitate n × n
Operaţiile booleene (conjuncţie) şi ⊕ (disjuncţie):
0 1 ⊕ 0 1 Observaţii:
0 0 0 0 0 1 a b = min(a, b)
1 0 1 1 1 1 a ⊕ b = max(a, b)
Dacă U = (uij ), V = (vij ) sunt matrici n × n cu elemente 0
sau 1, definim
U ⊕ V = (cij ) dacă cij = uij ⊕ vij pentru toţi i, j
U V = (dij ) dacă dij = (ui1 v1j ) ⊕ . . . ⊕ (uin vnj )
U k = U . . . U pentru orice k > 0
| {z }
k ori
Cursul 8
Digrafuri simple
Proprietăţi ale matricii de adiacenţă AG (continuare)

Proprietăţi
(k) (k)
1 Dacă AkG = (aij ) pentru k ≥ 1 atunci aij = 1 dacă şi numai
dacă există o cale cu lungimea k de la nodul vi la vj .
n−1
2 Fie A∗G = In ⊕ AG ⊕ A2G ⊕ . . . ⊕ AG = (aij ). Atunci
aij = 1 dacă şi numai dacă există o cale de lungime
j ∈ {1, . . . , n − 1} de la nodul vi la vj .
A∗G se poate calcula ı̂n O(n4 ).
A∗G se numeşte ı̂nchidere reflexivă şi tranzitivă a lui AG .
3 vi şi vj sunt conectate ⇔ ∃ o cale simplă vi vj ⇔ aij = 1.
4 In ⊕ AG ⊕ A2G ⊕ ... ⊕ Ak+1
G = In ⊕ (In ⊕ AG ⊕ A2G ⊕ . . . ⊕ AkG ) AG
⇒ A∗ se poate calcula ı̂n O(n4 ).

Cursul 8
Digrafuri simple
Proprietăţi ale matricii de adiacenţă AG (continuare)

Proprietăţi
(k) (k)
1 Dacă AkG = (aij ) pentru k ≥ 1 atunci aij = 1 dacă şi numai
dacă există o cale cu lungimea k de la nodul vi la vj .
n−1
2 Fie A∗G = In ⊕ AG ⊕ A2G ⊕ . . . ⊕ AG = (aij ). Atunci
aij = 1 dacă şi numai dacă există o cale de lungime
j ∈ {1, . . . , n − 1} de la nodul vi la vj .
A∗G se poate calcula ı̂n O(n4 ).
A∗G se numeşte ı̂nchidere reflexivă şi tranzitivă a lui AG .
3 vi şi vj sunt conectate ⇔ ∃ o cale simplă vi vj ⇔ aij = 1.
4 In ⊕ AG ⊕ A2G ⊕ ... ⊕ Ak+1
G = In ⊕ (In ⊕ AG ⊕ A2G ⊕ . . . ⊕ AkG ) AG
⇒ A∗ se poate calcula ı̂n O(n4 ).

Corolar
Conectivitatea ı̂ntr-un digraf simplu se poate detecta ı̂n O(n4 ).

Cursul 8
Digrafuri simple
Metode mai eficiente de calcul al lui A∗G

Algoritmul lui Warshall calculează A∗G ı̂n O(n3 ).

Idee de bază a lui Warshall


Dacă V = [v1 , . . . , vn ] este o enumerare a nodurilor lui G şi
vk ∈ V , atunci orice cale simplă π : vi vj are una din
următoarele forme:
1 vk nu apare ı̂n π ca nod intermediar ı̂ntre vi şi vj
vk
vi vj
2 vk apare exact o dată ı̂n π ca nod intermediar ı̂ntre vi şi vj
vk
vi vj

Cursul 8
Digrafuri simple
Algoritmul lui Warshall de calcul al lui A∗G

Presupunem că AG = (aij ) are dimensiune n × n


[n]
I Se calculează recursiv C [n] = (cij ) unde
(
[k] aij dacă k = 0
cij := [k−1] [k−1] [k−1]
cij ⊕ (cik ckj ) dacă k ≥ 1

Proprietăţi
1 C [ 0] = AG
[k]
2 cij = 1 dacă şi numai dacă există o cale π : vi vj ı̂n care
toate nodurile intermediare sunt din submulţimea {v1 , . . . , vk }
3 C [n] = A∗G
4 C [n] se calculează ı̂n O(n3 ).

Cursul 8
Digrafuri simple ponderate
Cele cea mai uşoare căi

Se consideră digraful simplu G = (V , E ) cu V = {1, . . . , n} şi


funcţia de greutate w : E → R+
I În G , greutatea unei căi π : v1 → v2 → . . . → vp este
Pp−1
w (π) = i=1 w ((vi , vi+1 ))
(se adună greutăţile tuturor arcelor din π)
I Pentru orice pereche de noduri (i, j) din V , se doreşte găsirea
celei mai uşoare căi de la nodul i la nodul j
(pot fi mai multe căi cele mai uşoare)
greutatea celei mai uşoare căi
Reamintim că matricea de ponderi a lui G este WG = (wij ) unde

 0 dacă j = i,
wij = w ((i, j)) dacă(i, j) ∈ E ,
∞ dacă (i, j) 6∈ E

Cursul 8
Cele mai uşoare căi ı̂ntr-un digraf simplu ponderat
Algoritmul lui Warshall: Idee de bază

Generalizare a ideii de calcul a celor mai mai scurte căi: Fie


k ∈ V = {1, . . . , n}, şi π : i j o cale cea mai uşoară de la i la j.
Distingem două cazuri:
1 π nu trece prin nodul k
π1 π2
2 π trece prin k. Atunci π = i k j şi w (π) = w (π1 ) + w (π2 ).

Cursul 8
Cele mai uşoare căi ı̂ntr-un digraf simplu ponderat
Algoritmul lui Warshall: Idee de bază

Generalizare a ideii de calcul a celor mai mai scurte căi: Fie


k ∈ V = {1, . . . , n}, şi π : i j o cale cea mai uşoară de la i la j.
Distingem două cazuri:
1 π nu trece prin nodul k
π1 π2
2 π trece prin k. Atunci π = i k j şi w (π) = w (π1 ) + w (π2 ).
Structură de date auxiliară de calcul:
[k]
Matrice de căi uşoare P [k] = (pij ) ı̂n care fiecare


 • valoare specială: @ cale i j prin noduri
intermediare din submulţimea {1, . . . , k}

[k]
pij :=
 π o cea mai uşoară cale de la i la j prin noduri

intermediare din submulţimea {1, . . . , k}

Cursul 8
Cele mai uşoare căi ı̂ntr-un digraf simplu ponderat
Algoritmul lui Warshall: Noţiuni auxiliare

Presupunem că matricea de ponderi a lui G este WG = (wij ).


Pentru orice 0 ≤ k ≤ n se calculează recursiv, ı̂ncepând de la
k = 0, următoarele valori:
[k]
I pij : o cale cea mai uşoară p : i j, ı̂n care toate nodurile
intermediare sunt din mulţimea {1, 2, . . . , k}.
[k] [k]
I wij : greutatea căii pij
Observaţii:
[k]
Dacă nu există o astfel de cale de la i al j, definim pij = • şi
[k]
wij = ∞.
[0]
wij := wij şi

 [i] dacă i = j (ı̂n acest caz, wij = wii = 0)
[0]
pij := [i, j] dacă i 6= j şi wij < ∞
• dacă wij = ∞

Cursul 8
Cele mai uşoare căi ı̂ntr-un digraf simplu ponderat
Algoritmul lui Warshall: Formule de calcul recursiv

Pentru 0 < k ≤ n :
( [k−1] [k−1] [k−1] [k−1]
[k] pij dacă wij ≤ wik + wkj
pij := [k−1] [k−1]
pik  pkj ı̂n caz contrar
[k−1] [k−1] [k−1] [k−1]
unde pik  pkj denotă concatenarea căilor pik şi pkj .
( [k−1] [k−1] [k−1] [k−1]
[k] wij dacă wij ≤ wik + wkj
wij := [k−1] [k−1]
wik + wkj ı̂n caz contrar

Observaţii
[n] [n]
I Pentru orice 1 ≤ i, j ≤ n, dacă pij 6= • atunci pij este o cea
[n] [n]
mai uşoară cale de la i la j, iar w (pij ) = wij .
I Calculul matricilor W [n] şi P [n] se efectuează ı̂n O(n3 ).
Cursul 8
Cele mai scurte căi ı̂ntr-un digraf simplu

Lungimea unei căi p = [x1 , . . . , xn ] este n − 1, adică numărul


de arce ce la x1 la xn de-a lungul căii p.
Dacă presupunem că fiecare arc are greutatea 1, atunci
lungimea unei căi coincide cu greutatea ei.
⇒ cele mai scurte căi dintre orice pereche de noduri pot fi
calculate cu algoritmul lui Warshall (vezi slide-ul următor.)

Cursul 8
Cele mai scurte căi ı̂ntr-un digraf simplu
Algoritmul lui Warshall ilustrat

v2 [v1 ]0 • [v1 , v3 ]1 • •
 
1 [v2 , v1 ]1 [v2 ]0 • • • 
v1 1 v3 [0]
PWG = • • [v3 ]0 • [v3 , v5 ]1  ,
 
1  • • • 
1

[v4 , v3 ]1 [v4 ]0
1
v5 1
v4 [v5 , v1 ]1 • • [v5 , v4 ]1 [v5 ]0
[v1 ]0 • [v1 , v3 ]1 • •
 
[v2 , v1 ]1 [v2 ]0 [v2 , v1 , v3 ]2 • • 
[1]
PWG = • • [v3 ]0 • [v3 , v5 ]1 ,
 
 • • [v4 , v3 ]1 [v4 ]0 • 
[v5 , v1 ] • [v5 , v1 , v3 ]2 [v5 , v4 ]1 [v5 ]0
[2] [1] [3]
PWG = PWG , PWG =
[v1 ]0 • [v1 , v3 ]1 • [v1 , v3 , v5 ]2
 
[v2 , v1 ]1 [v2 ]0 [v2 , v1 , v3 ]2 • [v2 , v1 , v3 , v5 ]3 
[4] [3]
 • • [v3 ]0 • [v3 , v5 ]1 , PWG = PWG ,
 
 • • [v4 , v3 ]1 [v4 ]0 [v4 , v3 , v5 ]2 
[v5 , v1 ]1 • [v5 , v1 , v3 ]2 [v5 , v4 ]1 [v5 ]0
[v1 ]0 • [v1 , v3 ] [v1 , v3 , v5 , v4 ]3 [v1 , v3 , v5 ]2
 
 [v2 , v1 ]1 [v2 ]0 [v2 , v1 , v3 ]2 [v2 , v1 , v3 , v5 , v4 ]4 [v2 , v1 , v3 , v5 ]3 
[5] 
PWG = [v3 , v5 , v1 ]2 • [v3 ]0 • [v3 , v5 ]1 

[v , v , v , v ]
4 3 5 1 3 • [v4 , v3 ]1 [v4 ]0 [v4 , v3 , v5 ]2 
[v5 , v1 ]1 • [v5 , v1 , v3 ]2 [v5 , v4 ]1 [v5 ]0

Cursul 8