Sunteți pe pagina 1din 36

Algoritmi si programare 2008 - 2009 1

Curs 4
Grafuri
tipul abstract Graf
tipul abstract Digraf
implementarea cu matrici de adiacen
implementarea cu liste de adiacen nlnuite
algoritmi de parcurgere (DFS, BFS)
determinarea componentelor (tare) conexe
sortare topologic
Algoritmi si programare 2008 - 2009 2
Grafuri
G = (V, E)
V mulime de vrfuri
E mulime de muchii; o muchie = o pereche
neordonat de vrfuri distincte
0
3 2
1
V = {0, l, 2, 3}
E ={{0,1}, {0,2}, {1,2}, {2, 3}}
u = {0,1} = {1, 0}
0 1
0, 1 extremitile lui u
u este incident n 0 i 1
0 i 1 sunt adiacente (vecine)
Algoritmi si programare 2008 - 2009 3
Grafuri
Mers de la u la v: u = i
0
, {i
0
,i
1
}, i
1
, ..., {i
k-1
,i
k
},
i
k
= v
3, {3,2}, 2, {2,0}, 0, {0,1}, 1, {1,3},3,{3,2},2
parcurs: mers n care oricare dou muchii sunt
distincte
drum: mers n care oricare dou vrfuri sunt
distincte
mers nchis: i
0
= i
k

circuit = mers nchis n care oricare dou vrfuri
intermediare sunt distincte
0
3 2
1
Algoritmi si programare 2008 - 2009 4
Grafuri - Conexitate
i R j dac i numai dac exist drum de la i la j
R este relaie de echivalen
V
1
, ..., V
p
clasele de echivalen
G
i
= (V
i
, E
i
) subgraful indus de V
i
G
1
, ..., G
p
componente conexe
graf conex = graf cu o singur component
conex
2
4
7
8
3
5
V
1
= {2, 4, 7}
E
1
= {{2, 4}, {4, 7}, {2, 7}}
V
2
= {3, 5, 8}
E
2
= {{3, 5}, {5, 8}, {8, 3}}
Algoritmi si programare 2008 - 2009 5
Tipul de date abstract Graf
obiecte: grafuri G = (V, E), V = {0, 1, ...,
n-1}
operaii:
grafVid()
intrare: nimic
ieire: graful vid (C, C)
esteGrafVid()
intrare: G = (V, E),
ieire: true daca G =(C, C), false n caz contrar
insereazaMuchie()
intrare: G = (V, E), i, j eV
ieire: G = (V, E {i, j})
insereazaVarf()
intrare: G = (V, E), V = {0, 1, ..., n-1}
ieire: G = (V, E), V = {0, 1, ..., n-1, n}
Algoritmi si programare 2008 - 2009 6
Tipul de date abstract Graf
eliminaMuchie()
intrare: G = (V, E), i, j eV
ieire: G = (V, E {i, j})
eliminaVarf()
intrare: G = (V, E), V = {0, 1, ..., n-1}, k
ieire: G = (V, E), V = {0, 1, ..., n-2}
{i, j} e E (-{i, j} e E) i k, j k ,
i = if (i < k) then i else i-1,
j = if (j < k) then j else j-1
0
3 2
1
2
Algoritmi si programare 2008 - 2009 7
Tipul de date abstract Graf
listaDeAdiacenta()
intrare: G = (V, E), i eV
ieire: lista vrfurilor adiacente cu i
listaVarfurilorAccesibile()
intrare: G = (V, E), i eV
ieire: lista vrfurilor accesibile din i

Algoritmi si programare 2008 - 2009 8
Digraf
D = (V, A)
V mulime de vrfuri
A mulime de arce; un arc = o pereche
ordonat de vrfuri distincte
0
3 2
1
V = {0, l, 2, 3}
A ={(0,1), (2,0), (1,2), (3, 2)}
a = (0,1) (1, 0)
0 1
0 sursa lui a
1 destinatia lui a
Algoritmi si programare 2008 - 2009 9
Digraf
mers: i
0
, (i
0
,i
1
), i
1
, ..., (i
k-1
,i
k
), i
k
3, (3,2), 2, (2,0), 0, (0,1), 1, (1,2), 2, (2,0), 0
parcurs: mers n care oricare dou arce sunt
distincte
drum: mers n care oricare dou vrfuri sunt
distincte
mers nchis: i
0
= i
k

circuit = mers nchis n care oricare dou
vrfuri intermediare sunt distincte
0
3 2
1
Algoritmi si programare 2008 - 2009 10
Digraf - Conexitate
i R j dac i numai dac exist drum de la i la j
i drum de la j la i
R este relaie de echivalen
V
1
, ..., V
p
clasele de echivalen
G
i
= (V
i
, A
i
) subdigraful indus de V
i
G
1
, ..., G
p
componente tare conexe
digraf tare conex = digraf cu o singur
component tare conex
V1 = {0, 1, 2}
A1 = {(0, 1), (1, 2), (2, 0)}
V2 = {3}
A2 =
3
0
2
1
Algoritmi si programare 2008 - 2009 11
Tipul de date abstract Digraf
obiecte: digrafuri D = (V, A)
operaii:
digrafVid()
intrare: nimic
ieire: digraful vid (C, C)
esteDigrafVid()
intrare: D = (V, A),
ieire: true dac D =(C, C), false n caz contrar
insereazaArc()
intrare: D = (V, A), i, j eV
ieire: D = (V, A (i, j))
insereazaVarf()
intrare: D = (V, A), V = {0, 1, ..., n-1}
iesire: D = (V, A), V = {0, 1, ..., n-1, n}
Algoritmi si programare 2008 - 2009 12
Tipul de date abstract Digraf
eliminaArc()
intrare: D = (V, A), i, j eV
ieire: D = (V, A (i, j))
eliminaVarf()
intrare: D = (V, A), V = {0, 1, ..., n-1}, k
ieire: D = (V, A), V = {0, 1, ..., n-2}
(i, j) e A
(-(i, j) e A) i k, j k ,
i = if (i < k) then i else i-1,
j = if (j < k) then j else j-1
Algoritmi si programare 2008 - 2009 13
Tipul de date abstract Digraf
listaDeAdiacentaExterioara()
intrare: D = (V, A), i eV
ieire: lista vrfurilor destinatare ale
arcelor care pleac din i
listaDeAdiacentaInterioara()
intrare: D = (V, A), i eV
ieire: lista vrfurilor surs ale arcelor care
sosesc in i
listaVarfurilorAccesibile()
intrare: D = (V, A), i eV
ieire: lista vrfurilor accesibile din i
Algoritmi si programare 2008 - 2009 14
Reprezentarea grafurilor ca digrafuri
G = (V, E) D(G) = (V, A)
{i,j} e E (i,j), (j,i) e A
topologia este pstrat
lista de adiacen a lui i in G = lista de
adiacen exterioar (=interioar) a lui i n D
0
3 2
1
0
3 2
1

Algoritmi si programare 2008 - 2009 15
Implementarea cu matrici de adiacen
a digrafurilor
reprezentarea digrafurilor
n numrul de vrfuri
m numrul de arce (opional)
o matrice (a[i,j]| 1 s i, j s n)
a[i,j] = if (i,j) e A then 1 else 0
dac digraful reprezint un graf, atunci a[i,j]
este simetric
lista de adiacen exterioar a lui i _ linia i
lista de adiacen interioar a lui i _ coloana i
Algoritmi si programare 2008 - 2009 16
Implementarea cu matrici de
adiacen
0
3 2
1
0 1 2 3
0 0 1 0 0
1 0 0 1 0
2 1 0 0 0
3 0 1 1 0
Algoritmi si programare 2008 - 2009 17
Implementarea cu matrici de
adiacen
operaii
digrafVid
n 0; m 0
insereazaVarf: O(n)
insereazaArc: O(1)
eliminaArc: O(1)

Algoritmi si programare 2008 - 2009 18
Implementarea cu matrici de
adiacen
eliminaVarf()

procedure eliminaVirf(a, n, k)
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 execuie: O(n
2
)
Algoritmi si programare 2008 - 2009 19
Implementarea cu matrici de
adiacen
listaVarfurilorAccesibile()

procedure inchReflTranz(a, n, b)
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(n
3
)
Algoritmi si programare 2008 - 2009 20
Implementarea cu liste de adiacen
reprezentarea digrafurilor cu liste de adiacen
exterioar
0 1
2
3
1 2 3 0
1
2
3
3
1
a
un tablou a[0..n-1] de liste inlnuite (pointeri)
a[i] este lista de adiacen exterioar corespunztoare lui i
Algoritmi si programare 2008 - 2009 21
Implementarea cu liste de adiacen
operaii
digrafVid
insereazaVarf: O(1)
insereazaArc: O(1)
eliminaVarf: O(n+m)
eliminaArc: O(m)
1 2 3 0
1
2
3
3
1
a
Algoritmi si programare 2008 - 2009 22
Digrafuri: explorare sistematic
se gestioneaz dou mulimi
S = mulimea vrfurilor vizitate deja
SB _ S submulimea vrfurilor
pentru care exist anse s gsim
vecini nevizitai nc
lista de adiacen (exterioar) a lui
i este divizat in dou:
a[i]
procesate lista de asteptare
Algoritmi si programare 2008 - 2009 23
Digrafuri: explorare sistematica
pasul curent
citete un vrf i din SB
extrage un j din lista de ateptare a lui i (dac
este nevid)
dac j nu este n S, atunci l adaug la S i la SB
dac lista de ateptare a lui i este vid, atunci
elimin i din SB
iniial
S = SB = {i
0
}
lista de ateptare a lui i = lista de adiacenta a
lui i
terminare SB = C
Algoritmi si programare 2008 - 2009 24
Digrafuri: explorare sistematic
procedure explorare(a, n, i0, S)
for i 0 to n-1 do p[i] a[i]
SB (i0); S (i0);
viziteaza(i0)
while (SB = C) do
i citeste(SB)
if (p[i] = NULL) then SB SB-{i}
else j p[i]->virf
p[i] p[i]->succ
if (j e S)
then SB SB {j}
S S {j}
viziteaza(j)
end
Algoritmi si programare 2008 - 2009 25
Explorare sistematic:
complexitate
Teorem
n ipoteza c operaiile 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).
Algoritmi si programare 2008 - 2009 26
Explorarea DFS (Depth First Search)
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)
Algoritmi si programare 2008 - 2009 27
Explorarea DFS: exemplu
Arborele DFS
0 1
7
3
5
4
6
8
2
0
1
7
3
5
4
6
8
2
Stiva
0
1
3
5
4
6
8
2
7
Algoritmi si programare 2008 - 2009 28
Explorarea BFS (Breadth First Search)
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)
Algoritmi si programare 2008 - 2009 29
Explorarea BFS: exemplu
Arborele BFS
0 1
7
3
5
4
6
8
2
0
1
7
5
4
6
8
2
3
Algoritmi si programare 2008 - 2009 30
Determinarea componentelor conexe


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
Algoritmi si programare 2008 - 2009 31
Determinarea componentelor conexe
procedure DfsRecCompConexe(i, k)
begin
culoare[i] k
for (fiecare virf j in listaDeAdiac(i)) do
if (culoare[j] = 0)
then DfsRecCompConexe(j, k)
end

Algoritmi si programare 2008 - 2009 32
Componente tare conexe: exemplu
1 (2, 3, 4)
2 (1, 4)
3 (2, 4)
4 (5)
5 (7)
6 (5)
7 (6)
1
2
3
4 5
6
7
1
2
4
5
7
6
3
7
8
9
10
11
14
13
2
3
1
4
6
7
5
D
1
2
3
4 5
6
7
D
T
Algoritmi si programare 2008 - 2009 33
Determinarea componentelor tare conexe
procedure DfsCompTareConexe(D)
begin
for i 0 to n-1 do
culoare[i] 0
tata[i] -1
k 0
timp 0
for i 0 to n-1 do
if (culoare[i] = 0)
then DfsRecCompTareConexe(i)
end
Algoritmi si programare 2008 - 2009 34
Determinarea componentelor tare conexe
procedure DfsRecCompTareConexe(i)
Begin
timp timp + 1
culoare[i] 1
for (fiecare virf j in listaDeAdiac(i)) do
if (culoare[j] = 0)
then tata[j] i
DfsRecCompTareConexe(j)
timp timp + 1
timpFinal[i] timp
end
Algoritmi si programare 2008 - 2009 35
Determinarea componentelor tare conexe
Notatie:
D
T
= (V, A
T
), (i, j) e A (j, i) e A
T

procedure CompTareConexe(D)
1. DFSCompTareConexe(D)
2. calculeaza D
T

3. DFSCompTareConexe(D
T
) dar considernd n
bucla for principal vrfurile n ordinea
descresctoare a timpilor finali de vizitare
timpFinal[i]
4. returneaz fiecare arbore calculat la pasul
3. ca fiind o component tare conex
separat
end
Algoritmi si programare 2008 - 2009 36
Determinarea comp. tare conexe: complexitate

DFSCompTareConexe(D): O(n + m)
calculeaza D
T
: O(m)
DFSCompTareConexe(D
T
): O(n + m)
Total: O(n + m)

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