Professional Documents
Culture Documents
SD 2017/2018
Conţinut
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}
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}
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
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
V 1 = {0, 1, 2}
A1 = {(0, 1), (1, 2), (2, 0)}
V 2 = {3}
A2 = ∅
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}
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
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
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
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
0 1 2 3
0 0 1 0 0
1 0 0 1 0
2 1 0 0 0
3 0 1 1 0
I operaţii
I digrafVid
n ← 0; m ← 0
I insereazaVarf: O(n)
I insereazaArc: O(1)
I eliminaArc: O(1)
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 )
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
I operaţii
I digrafVid
I insereazaVarf: O(1)
I insereazaArc: O(1)
I eliminaVarf: O(n + m)
I eliminaArc: O(m)
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 = ∅
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).
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
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
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
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
I DFSCompTareConexe(D): O(n + m)
I calculează D T : O(m)
I DFSCompTareConexe(D T ): O(n + m)
I Total: O(n + m)
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ă?
Este posibil să alegem un vârf, să parcurgem muchiile şi să ne intoarcem ı̂n
varful ales, acoperind toate muchiile o dată?