You are on page 1of 46

Grafuri

SD 2017/2018
Conţinut

Tipul abstract Graf

Tipul abstract Digraf

Implementarea cu matrici de adiacenţă

Implementarea cu liste de adiacenţă ı̂nlănţuite

Algoritmi de parcurgere (DFS, BFS)

Determinarea componentelor (tare) conexe

FII, UAIC Curs 7 SD 2017/2018 2 / 46


Grafuri

I G = (V , E )
I V mulţime de vârfuri
I E mulţime de muchii; o muchie = o pereche neordonată de vârfuri
distincte

V = {0, 1, 2, 3}
E = {{0, 1}, {0, 2}, {1, 2}, {2, 3}}
u = {0, 1} = {1, 0}

0,1 - extremităţile lui u


u este incidentă ı̂n 0 şi 1
0 şi 1 sunt adiacente (vecine)

FII, UAIC Curs 7 SD 2017/2018 3 / 46


Grafuri
I Mers de la u la v : u = i0 , {i0 , i1 }, i1 , · · · , {ik−1 , ik }, ik = v
3, {3,2}, 2, {2,0}, 0, {0,1}, 1, {1,3},3, {3,2}, 2
I parcurs: mers ı̂n care oricare două muchii sunt distincte
I drum: mers ı̂n care oricare două vârfuri sunt distincte
I mers ı̂nchis: i0 = ik
I circuit = mers ı̂nchis ı̂n care oricare două vârfuri intermediare sunt
distincte

FII, UAIC Curs 7 SD 2017/2018 4 / 46


Subgraf indus

I G = (V , E ) – graf, W – submulţime a lui V


I Subgraf indus de W : G 0 (W , E 0 ), unde
E 0 = {{i, j}|{i, j} ∈ E şi i ∈ W , j ∈ W }

FII, UAIC Curs 7 SD 2017/2018 5 / 46


Grafuri - Conexitate

I i R j dacă şi numai dacă există drum de la i la j


I R este relaţie de echivalenţă
I V1 , · · · , Vp clasele de echivalenţă
I Gi = (Vi , Ei ) subgraful indus de Vi
I G1 , · · · , Gp – componente conexe
I graf conex = graf cu o singură componentă conexă

FII, UAIC Curs 7 SD 2017/2018 6 / 46


Tipul de date abstract Graf

I obiecte:
I grafuri G = (V , E ), V = {0, 1, · · · , n − 1}
I operaţii:
I grafVid()
I intrare: nimic
I ieşire: graful vid (∅, ∅)
I esteGrafVid()
I intrare: G = (V , E ),
I ieşire: true daca G = (∅, ∅), false ı̂n caz contrar
I insereazaMuchie()
I intrare: G = (V , E ), i, j ∈ V
I ieşire: G = (V , E ∪ {i, j})
I insereazaVarf()
I intrare: G = (V , E ), V = {0, 1, · · · , n − 1}
I ieşire: G = (V 0 , E ), V 0 = {0, 1, · · · , n − 1, n}

FII, UAIC Curs 7 SD 2017/2018 7 / 46


Tipul de date abstract Graf
I eliminaMuchie()
I intrare: G = (V , E ), i, j ∈ V
I ieşire: G = (V , E –{i, j})
I eliminaVarf()
I intrare: G = (V , E ), V = {0, 1, · · · , n − 1}, k
I ieşire: G = (V 0 , E 0 ), V 0 = {0, 1, · · · , n − 2}
{i 0 , j 0 } ∈ E 0 ⇔ (∃{i, j} ∈ E ) i 6= k, j 6= k,
i 0 = if (i < k) then i else i − 1,
j 0 = if (j < k) then j else j − 1

FII, UAIC Curs 7 SD 2017/2018 8 / 46


Tipul de date abstract Graf

I listaDeAdiacenta()
I intrare: G = (V , E ), i ∈ V
I ieşire: lista vârfurilor adiacente cu i

I listaVarfurilorAccesibile()
I intrare: G = (V , E ), i ∈ V
I ieşire: lista vârfurilor accesibile din i

FII, UAIC Curs 7 SD 2017/2018 9 / 46


Conţinut

Tipul abstract Graf

Tipul abstract Digraf

Implementarea cu matrici de adiacenţă

Implementarea cu liste de adiacenţă ı̂nlănţuite

Algoritmi de parcurgere (DFS, BFS)

Determinarea componentelor (tare) conexe

FII, UAIC Curs 7 SD 2017/2018 10 / 46


Digraf (graf orientat)

I D = (V , A)
I V mulţime de vârfuri
I A mulţime de arce; un arc = o pereche ordonată de vârfuri distincte

V = {0, 1, 2, 3}
A = {(0, 1), (2, 0), (1, 2), (3, 2)}
a = (0, 1) 6= (1, 0)

0 – sursa lui a
1 – destinaţia lui a

FII, UAIC Curs 7 SD 2017/2018 11 / 46


Digraf

I mers: i0 , (i0 , i1 ), i1 , · · · , (ik−1 , ik ), ik


3, (3,2), 2, (2,0), 0, (0,1), 1, (1,2), 2, (2,0), 0
I parcurs: mers ı̂n care oricare două arce sunt distincte
I drum: mers ı̂n care oricare două vârfuri sunt distincte
I mers ı̂nchis: i0 = ik
I circuit = mers ı̂nchis ı̂n care oricare două vârfuri intermediare sunt
distincte

FII, UAIC Curs 7 SD 2017/2018 12 / 46


Digraf - Conexitate

I i R j dacă şi numai dacă există drum de la i la j şi drum de la j la i


I R este relaţie de echivalenţă
I V1 , · · · , Vp clasele de echivalenţă
I Gi = (Vi , Ai ) subdigraful indus de Vi
I G1 , · · · , Gp – componente tare conexe
I digraf tare conex = digraf cu o singură componentă tare conexă

V 1 = {0, 1, 2}
A1 = {(0, 1), (1, 2), (2, 0)}
V 2 = {3}
A2 = ∅

FII, UAIC Curs 7 SD 2017/2018 13 / 46


Tipul de date abstract Digraf

I obiecte: digrafuri D = (V , A)
I operaţii:
I digrafVid()
I intrare: nimic
I ieşire: digraful vid (∅, ∅)
I esteDigrafVid()
I intrare: D = (V , A),
I ieşire: true dacă D = (∅, ∅), false ı̂n caz contrar
I insereazaArc()
I intrare: D = (V , A), i, j ∈ V
I ieşire: D = (V , A ∪ (i, j))
I insereazaVarf()
I intrare: D = (V , A), V = {0, 1, · · · , n − 1}
I ieşire: D = (V 0 , A), V 0 = {0, 1, · · · , n − 1, n}

FII, UAIC Curs 7 SD 2017/2018 14 / 46


Tipul de date abstract Digraf

I eliminaArc()
I intrare: D = (V , A), i, j ∈ V
I ieşire: D = (V , A–(i, j))
I eliminaVarf()
I intrare: D = (V , A), V = {0, 1, · · · , n − 1}, k
I ieşire: D = (V 0 , A0 ), V 0 = {0, 1, · · · , n − 2}

{i 0 , j 0 } ∈ A0 ⇔ (∃{i, j} ∈ A) i 6= k, j 6= k,
i 0 = if (i < k) then i else i − 1,
j 0 = if (j < k) then j else j − 1

FII, UAIC Curs 7 SD 2017/2018 15 / 46


Tipul de date abstract Digraf

I listaDeAdiacentaExterioara()
I intrare: D = (V , A), i ∈ V
I ieşire: lista vârfurilor destinatare ale arcelor care pleacă din i

I listaDeAdiacentaInterioara()
I intrare: D = (V , A), i ∈ V
I ieşire: lista vârfurilor sursă ale arcelor care sosesc ı̂n i

I listaVarfurilorAccesibile()
I intrare: D = (V , A), i ∈ V
I ieşire: lista vârfurilor accesibile din i

FII, UAIC Curs 7 SD 2017/2018 16 / 46


Reprezentarea grafurilor ca digrafuri

G = (V , E ) =⇒ D(G ) = (V , A)
i, j ∈ E =⇒ (i, j), (j, i) ∈ A
I topologia este păstrată
I lista de adiacenţă a lui i ı̂n G = lista de adiacenţă exterioară
(=interioară) a lui i ı̂n D

FII, UAIC Curs 7 SD 2017/2018 17 / 46


Conţinut

Tipul abstract Graf

Tipul abstract Digraf

Implementarea cu matrici de adiacenţă

Implementarea cu liste de adiacenţă ı̂nlănţuite

Algoritmi de parcurgere (DFS, BFS)

Determinarea componentelor (tare) conexe

FII, UAIC Curs 7 SD 2017/2018 18 / 46


Implementarea cu matrici de adiacenţă a digrafurilor

I reprezentarea digrafurilor
I n numărul de vârfuri
I m numărul de arce (opţional)
I o matrice (a[i, j]| 1 ≤ i, j ≤ n)
a[i, j] = if (i, j) ∈ A then 1 else 0

I dacă digraful reprezintă un graf, atunci a[i, j] este simetrică


I lista de adiacenţă exterioară a lui i ⊆ linia i
I lista de adiacenţă interioară a lui i ⊆ coloana i

FII, UAIC Curs 7 SD 2017/2018 19 / 46


Implementarea cu matrici de adiacenţă

0 1 2 3
0 0 1 0 0
1 0 0 1 0
2 1 0 0 0
3 0 1 1 0

FII, UAIC Curs 7 SD 2017/2018 20 / 46


Implementarea cu matrici de adiacenţă

I operaţii
I digrafVid
n ← 0; m ← 0
I insereazaVarf: O(n)
I insereazaArc: O(1)
I eliminaArc: O(1)

FII, UAIC Curs 7 SD 2017/2018 21 / 46


Implementarea cu matrici de adiacenţă

I eliminaVarf()
Procedure eliminaVarf(a, n, k)
begin
for i ← 0 to n − 1 do
for j ← 0 to n − 1 do
if (i > k) then
a[i − 1, j] ← a[i, j]
if (j > k) then
a[i, j − 1] ← a[i, j]
n ←n−1
end
timp de execuţie: O(n2 )

FII, UAIC Curs 7 SD 2017/2018 22 / 46


Implementarea cu matrici de adiacenţă

I listaVarfurilorAccesibile()
Procedure inchReflTranz(a, n, b) // (Warshall, 1962)
begin
for i ← 0 to n − 1 do
for j ← 0 to n − 1 do
b[i, j] ← a[i, j]
if (i = j) then
b[i, j] ← 1
for k ← 0 to n − 1 do
for i ← 0 to n − 1 do
if (b[i, k] = 1) then
for j ← 0 to n − 1 do
if (b[k, j] = 1) then
b[i, j] ← 1
end
timp de executie: O(n3 )
FII, UAIC Curs 7 SD 2017/2018 23 / 46
Conţinut

Tipul abstract Graf

Tipul abstract Digraf

Implementarea cu matrici de adiacenţă

Implementarea cu liste de adiacenţă ı̂nlănţuite

Algoritmi de parcurgere (DFS, BFS)

Determinarea componentelor (tare) conexe

FII, UAIC Curs 7 SD 2017/2018 24 / 46


Implementarea cu liste de adiacenţă

I reprezentarea digrafurilor cu liste de adiacenţă exterioară

I un tablou a[0..n − 1] de liste ı̂nlănţuite (pointeri)


I a[i] este lista de adiacenţă exterioară corespunzătoare lui i

FII, UAIC Curs 7 SD 2017/2018 25 / 46


Implementarea cu liste de adiacenţă

I operaţii
I digrafVid
I insereazaVarf: O(1)
I insereazaArc: O(1)
I eliminaVarf: O(n + m)
I eliminaArc: O(m)

FII, UAIC Curs 7 SD 2017/2018 26 / 46


Conţinut

Tipul abstract Graf

Tipul abstract Digraf

Implementarea cu matrici de adiacenţă

Implementarea cu liste de adiacenţă ı̂nlănţuite

Algoritmi de parcurgere (DFS, BFS)

Determinarea componentelor (tare) conexe

FII, UAIC Curs 7 SD 2017/2018 27 / 46


Digrafuri: explorare sistematică

I se gestionează două mulţimi


I S = mulţimea vârfurilor vizitate deja
I SB ⊆ S submulţimea vârfurilor pentru care există şanse să găsim vecini
nevizitaţi ı̂ncă
I lista de adiacenţă (exterioară) a lui i este divizată ı̂n două:

FII, UAIC Curs 7 SD 2017/2018 28 / 46


Digrafuri: explorare sistematică

I pasul curent
I citeşte un vârf i din SB
I extrage un j din lista de “aşteptare” a lui i (dacă este nevidă)
I dacă j nu este ı̂n S, atunci ı̂l adaugă la S şi la SB
I dacă lista de “aşteptare” a lui i este vidă, atunci elimină i din SB
I iniţial
I S = SB = {i0 }
I lista de “aşteptare a lui i” = lista de adiacenta a lui i
I terminare SB = ∅

FII, UAIC Curs 7 SD 2017/2018 29 / 46


Digrafuri: explorare sistematică
Procedure explorare(a, n, i0)
begin
for i ← 0 to n − 1 do
p[i] ← a[i]
SB ← (i0)
viziteaza(i0); S ← (i0)
while (SB 6= ∅) do
i ← citeste(SB)
if (p[i] = NULL) then
SB ← SB − {i}
else
j ← p[i] → varf
p[i] ← p[i] → succ
if (j 6∈ S) then
SB ← SB ∪ {j}
viziteaza(j)
S ← S ∪ {j}
end
FII, UAIC Curs 7 SD 2017/2018 30 / 46
Explorare sistematică: complexitate

Teorema
În ipoteza că operaţiile peste S şi SB precum şi viziteaza() se realizează ı̂n
O(1), complexitatea timp, ı̂n cazul cel mai nefavorabil, a algoritmului
explorare este O(n + m).

FII, UAIC Curs 7 SD 2017/2018 31 / 46


Explorarea DFS (Depth First Search)

I SB este implementată ca stivă

SB ← (i0) ⇔SB ← stivaVida()


push(SB, i0)
i ← citeste(SB) ⇔i ← top(SB)
SB ← SB − {i} ⇔pop(SB)
SB ← SB ∪ {j} ⇔push(SB, j)

FII, UAIC Curs 7 SD 2017/2018 32 / 46


Explorarea DFS: exemplu

FII, UAIC Curs 7 SD 2017/2018 33 / 46


Explorarea BFS (Breadth First Search)

I SB este implementată ca o coadă

SB ← (i0) ⇔SB ← coadaVida();


insereaza(SB, i0)
i ← citeste(SB) ⇔citeste(SB, i)
SB ← SB − {i} ⇔elimina(SB)
SB ← SB ∪ {j} ⇔insereaza(SB, j)

FII, UAIC Curs 7 SD 2017/2018 34 / 46


Explorarea BFS: exemplu

FII, UAIC Curs 7 SD 2017/2018 35 / 46


Conţinut

Tipul abstract Graf

Tipul abstract Digraf

Implementarea cu matrici de adiacenţă

Implementarea cu liste de adiacenţă ı̂nlănţuite

Algoritmi de parcurgere (DFS, BFS)

Determinarea componentelor (tare) conexe

FII, UAIC Curs 7 SD 2017/2018 36 / 46


Determinarea componentelor conexe (grafuri neorientate)

Function CompConexeDFS(D)
begin
for i ← 0 to n − 1 do
culoare[i] ← 0
k ←0
for i ← 0 to n − 1 do
if (culoare[i] = 0) then
k ←k +1
DfsRecCompConexe(i, k)
return k
end

FII, UAIC Curs 7 SD 2017/2018 37 / 46


Determinarea componentelor conexe (grafuri neorientate)

Procedure DfsRecCompConexe(i, k)
begin
culoare[i] ← k
for (fiecare vârf j ı̂n listaDeAdiac(i)) do
if (culoare[j] = 0) then
DfsRecCompConexe(j, k)
end

FII, UAIC Curs 7 SD 2017/2018 38 / 46


Componente tare conexe (digrafuri)

FII, UAIC Curs 7 SD 2017/2018 39 / 46


Componente tare conexe: exemplu

FII, UAIC Curs 7 SD 2017/2018 40 / 46


Determinarea componentelor tare conexe

Procedure DfsCompTareConexe(D)
begin
for i ← 0 to n − 1 do
culoare[i] ← 0
tata[i] ← −1
timp ← 0
for i ← 0 to n − 1 do
if (culoare[i] = 0) then
DfsRecCompTareConexe(i)
end

FII, UAIC Curs 7 SD 2017/2018 41 / 46


Determinarea componentelor tare conexe

Procedure DfsRecCompTareConexe(i)
begin
timp ← timp + 1
culoare[i] ← 1
for (fiecare vârf j in listaDeAdiac(i)) do
if (culoare[j] = 0) then
tata[j] ← i
DfsRecCompTareConexe(j)
timp ← timp + 1
timpFinal[i] ← timp
end

FII, UAIC Curs 7 SD 2017/2018 42 / 46


Determinarea componentelor tare conexe

Notaţie: D T = (V , AT ), (i, j) ∈ A ⇔ (j, i) ∈ AT


Procedure CompTareConexe(D)
begin
1. DFSCompTareConexe(D)
2. calculează D T
3. DFSCompTareConexe(D T ) dar considerând ı̂n bucla for principală
vârfurile ı̂n ordinea descrescătoare a timpilor finali de vizitare
timpFinal[i]
4. returnează fiecare arbore calculat la pasul 3 ca fiind o componentă
tare conexă separată
end

FII, UAIC Curs 7 SD 2017/2018 43 / 46


Determinarea componentelor tare conexe: complexitate

I DFSCompTareConexe(D): O(n + m)
I calculează D T : O(m)
I DFSCompTareConexe(D T ): O(n + m)
I Total: O(n + m)

FII, UAIC Curs 7 SD 2017/2018 44 / 46


Aplicaţii

Problema celor şapte poduri din Konigsberg (1736): realizarea unui drum
prin oras pornind dintr-o zonă pentru a traversa cele 7 poduri o singură
dată?

Zonele: vârfuri, podurile: muchii

Este posibil să alegem un vârf, să parcurgem muchiile şi să ne intoarcem ı̂n
varful ales, acoperind toate muchiile o dată?

FII, UAIC Curs 7 SD 2017/2018 45 / 46


Aplicaţii
I Algoritmică, probleme de drum, reţele de calculatoare (rutare),
genomică (reţele de aliniere, asamblarea genomului), multi-relational
data mining, cercetări operaţionale (planificare), inteligenţă artificială
(satisfacerea restricţiilor), etc.
I Motorul de căutare Google: algoritmul PageRank - pentru a
determina cât de importantă este o anumită pagină
I Sistem informaţional geografic (GIS): Google Maps, Bing Maps
I Reţele sociale

FII, UAIC Curs 7 SD 2017/2018 46 / 46

You might also like