Upload
others
View
25
Download
1
Embed Size (px)
Citation preview
Dorel Lucanu Algoritmica si programare
Curs 4
Grafuritipul abstract Graftipul abstract Digrafimplementarea cu matrici de adiacenta implementarea cu liste de adiacenta inlantuiteAlgoritmi de parcurgere (DFS, BFS)determinarea componentelor (tare) conexesortare topologica
Dorel Lucanu Algoritmica si programare
Grafuri
G = (V, E)V multime de varfuriE multime de muchii; o muchie = o pereche neordonata de varfuri 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 – extremitatile lui uu este incidenta in 0 si 10 si 1 sunt adiacente (vecine)
Dorel Lucanu Algoritmica si programare
Grafuri
mers: i0, {i0,i1}, i1, ..., {ik-1,ik}, ik3, {3,2}, 2, {2,0}, 0, {0,1}, 1, {1,3}, 3, {3,2}, 2
parcurs: mers in care oricare doua muchii suntdistinctedrum: mers in care oricare doua varfuri suntdistinctemers inchis: i0 = ikcircuit = mers inchis in care oricare doua varfuriintermediare sunt distincte
0
3 2
1
Dorel Lucanu Algoritmica si programare
Grafuri
i R j daca si numai daca exista drum de la i la jR este relatie de echivalentaV1, ..., Vp clasele de echivalentaGi = (Vi, Ei) subgraful indus de ViG1, ..., Gp – componente conexegraf conex = graf cu o singura componentaconexa
2
4
7
8
3
5V1 = {2, 4, 7}E1 = {{2, 4}, {4, 7}, {2, 7}}V2 = {3, 5, 8}E2 = {{3, 5}, {5, 8}, {8, 3}}
Dorel Lucanu Algoritmica si programare
Tipul de date abstract Graf
obiecte: grafuri G = (V, E), V = {0, 1, ..., n-1}operatii:
grafVid()intrare: nimiciesire: graful vid (∅, ∅)
esteGrafVid()intrare: G = (V, E),iesire: true daca G =(∅, ∅), false in cazcontrar
insereazaMuchie()intrare: G = (V, E), i, j ∈Viesire: G = (V, E ∪ {i, j})
insereazaVarf()intrare: G = (V, E), V = {0, 1, ..., n-1}iesire: G = (V’, E), V’ = {0, 1, ..., n-1, n}
Dorel Lucanu Algoritmica si programare
Tipul de date abstract Graf (continuare)
eliminaMuchie()intrare: G = (V, E), i, j ∈Viesire: G = (V, E – {i, j})
eliminaVarf()intrare: G = (V, E), V = {0, 1, ..., n-1}, kiesire: G = (V’, E’), V’ = {0, 1, ..., n-2}{i’, j’} ∈ E’ ⇔(∃{i, j} ∈ E) i ≠ k, j ≠ k ,
i’ = if (i < k) then i else i-1,j’ = if (j < k) then j else j-1
Dorel Lucanu Algoritmica si programare
Tipul de date abstract Graf (continuare)
listaDeAdiacenta() intrare: G = (V, E), i ∈Viesire: lista virfurilor adiacente cu i
listaVarfurilorAccesibile() intrare: G = (V, E), i ∈Viesire: lista varfurilor accesibile din i
Dorel Lucanu Algoritmica si programare
Digraf
D = (V, A)V multime de varfuriA multime de arce; un arc = o perecheordonata de varfuri 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 a1 – destinatia lui a
Dorel Lucanu Algoritmica si programare
Digraf
mers: i0, (i0,i1), i1, ..., (ik-1,ik), ik3, (3,2), 2, {2,0}, 0, (0,1), 1, (1,2), 2, (2,0), 0
parcurs: mers in care oricare doua arce suntdistinctedrum: mers in care oricare doua varfuri suntdistinctemers inchis: i0 = ikcircuit = mers inchis in care oricare douavarfuri intermediare sunt distincte
0
3 2
1
Dorel Lucanu Algoritmica si programare
Digraf
i R j daca si numai daca exista drum de la i la j si drum de la j la iR este relatie de echivalentaV1, ..., Vp clasele de echivalentaGi = (Vi, Ai) subdigraful indus de ViG1, ..., Gp – componente tare conexedigraf tare conex = digraf cu o singuracomponenta tare conexa
V1 = {0, 1, 2}A1 = {(0, 1), (1, 2), (2, 0)}V2 = {3}A2 = Ø
3
0
2
1
Dorel Lucanu Algoritmica si programare
Tipul de date abstract Digraf
obiecte: digrafuri D = (V, A)operatii:
digrafVid()intrare: nimiciesire: digraful vid (∅, ∅)
esteDigrafVid()intrare: D = (V, A),iesire: true daca D =(∅, ∅), false in cazcontrar
insereazaArc()intrare: D = (V, A), i, j ∈Viesire: 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}
Dorel Lucanu Algoritmica si programare
Tipul de date abstract Digraf (continuare)
eliminaArc()intrare: D = (V, A), i, j ∈Viesire: D = (V, A – (i, j))
eliminaVarf()intrare: D = (V, A), V = {0, 1, ..., n-1}, kiesire: D = (V’, A’), V’ = {0, 1, ..., n-2}(i’, j’) ∈ A’ ⇔(∃(i, j) ∈ A) i ≠ k, j ≠ k ,
i’ = if (i < k) then i else i-1,j’ = if (j < k) then j else j-1
Dorel Lucanu Algoritmica si programare
Tipul de date abstract Digraf (continuare)
listaDeAdiacentaExterioara() intrare: D = (V, A), i ∈Viesire: lista varfurilor destinatare ale arcelor care pleaca din i
listaDeAdiacentaInterioara() intrare: D = (V, A), i ∈Viesire: lista varfurilor sursa ale arcelorcare sosesc in i
listaVarfurilorAccesibile() intrare: D = (V, A), i ∈Viesire: lista varfurilor accesibile din i
Dorel Lucanu Algoritmica si programare
Reprezentarea grafurilor ca digrafuri
G = (V, E) ⇒ D(G) = (V, A){i,j} ∈ E ⇒ (i,j), (j,i) ∈ A topologia este pastrata
lista de adiacenta a lui i in G = lista de adiacenta exterioara (=interioara) a lui i in D
0
3 2
1 0
3 2
1
⇒
Dorel Lucanu Algoritmica si programare
Implementarea cu matrici de adiacenta a digrafurilor
reprezentarea digrafurilorn numarul de varfurim numarul de arce (optional)o matrice (a[i,j]| 1 ≤ i,j ≤ n)a[i,j] = if (i,j) ∈ A then 1 else 0daca digraful reprezinta un graf, atunci a[i,j] este simetrica lista de adiacenta exterioara a lui i ⊆ linia ilista de adiacenta interioara a lui i ⊆ coloana i
Dorel Lucanu Algoritmica si programare
Implementarea cu matrici de adiacenta
0
3 2
10
0
0
0
3210
1103
0012
1001
0100
Dorel Lucanu Algoritmica si programare
Implementarea cu matrici de adiacenta
operatiidigrafVidn ←0; m ← 0
insereazaVarf: O(n)insereazaArc: O(1)eliminaArc: O(1)
Dorel Lucanu Algoritmica si programare
Implementarea cu matrici de adiacenta
eliminaVarf()procedure eliminaVirf(a, n, k)
for i ← k+1 to n-1 dofor j ← 0 to n-1 do
a[i-1, j] ← a[i,j] for j ← k+1 to n-1 do
for i ← 0 to n-1 doa[i, j-1] ← a[i,j]
n ← n-1end
timp de executie: O(n2)
Dorel Lucanu Algoritmica si programare
Implementarea cu matrici de adiacenta
listaVarfurilorAccesibile()procedure inchReflTranz(a, n, b)
for i ← 0 to n-1 dofor 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 dofor 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
endtimp de executie: O(n3)
Dorel Lucanu Algoritmica si programare
Implementarea cu liste de adiacenta inl.
reprezentarea digrafurilor
0 1
2 3
1 2 30123
3
1
a
• un tablou a[0..n-1] de liste inlantuite (pointeri la ...)
•a[i] este lista de adiacenta exterioara corespunzatoare lui i
Dorel Lucanu Algoritmica si programare
Implementarea cu liste de adiacenta inl.
operatiidigrafVidinsereazaVarf: O(1)insereazaArc: O(1) eliminaVarf: O(n+m)eliminaArc: O(m)
1 2 30123
3
1
a
Dorel Lucanu Algoritmica si programare
Digrafuri: explorare sistematica
se gestioneaza doua multimiS = multimea virfurilor vizitate dejaSB ⊆ S submultimea virfurilor pentru care exista sanse sa gasim vecini nevizitati incalista de adiacenta (extrioara) a lui i este divizata in doua:
a[i]
procesate lista de asteptare
Dorel Lucanu Algoritmica si programare
Digrafuri: explorare sistematica
pasul curentciteste un virf i din SBextrage un j din lista de “asteptare” a lui i (daca este nevida)daca j nu este in S, atunci il adauga la S si la SBlista de “asteptare” a lui i este vida, atunci elimina i din SB
initialS = SB = {i0}lista de “asteptare a lui i” = lista de adiacenta a lui i
terminareSB = ∅
Dorel Lucanu Algoritmica si programare
Digrafuri: explorare sistematica
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 ≠ ∅) do
i ← citeste(SB)if (p[i] = NULL) then SB ← SB-{i}else j ← p[i]->virf
p[i] ← p[i]->succif (j ∉ S)then SB ← SB ∪ {j}S ← S ∪ {j}viziteaza(j)
end
Dorel Lucanu Algoritmica si programare
explorare sistematica: complexitate
TeoremaIn ipoteza ca operatiile peste S si SB si
vizitweaza() se realizeaza in O(1), complexitatea timp in cazul cel mainefavorabil a algoritmului explorare esteO(n+m).
Dorel Lucanu Algoritmica si programare
Explorarea DFS (Depth First Search)
SB este stivaSB ← (i0) ⇔ SB ← stivaVida()
push(SB, i0)i ← citeste(SB) ⇔ i ← top(SB)SB ← SB-{i} ⇔ pop(SB)SB ← SB ∪ {j} ⇔ push(SB, j)
Dorel Lucanu Algoritmica si programare
Explorarea DFS: exemplu
Arborele DFS
0 1
7 3
54
682
0
1
3
7
5
4
6
8
2
Dorel Lucanu Algoritmica si programare
Explorarea BFS (Breadth First Search)
SB este coadaSB ← (i0) ⇔ SB ← coadaVida();
insereaza(SB, i0)i ← citeste(SB) ⇔ citeste(SB, i)SB ← SB-{i} ⇔ elimina(SB)SB ← SB ∪ {j} ⇔ insereaza(SB, j)
Dorel Lucanu Algoritmica si programare
Explorarea BFS: exemplu
Arborele BFS
0 1
7 3
54
682
0
1 7
5
4
6
8
2
3
Dorel Lucanu Algoritmica si programare
Determinarea componentelor conexe
function CompConexeDFS(D)begin
for i ← 0 to n-1 do culoare[i] ← 0k ← 0for i ← 0 to n-1 do
if (culoare[i] = 0)then k ← k+1
DfsRecCompConexe(i, k)return k
end
Dorel Lucanu Algoritmica si programare
Determinarea componentelor conexe
procedure DfsRecCompConexe(i, k)begin
culoare[i] ← kfor (fiecare virf j in listaDeAdiac(i)) do
if (culoare[j] = 0)then DfsRecCompConexe(j, k)
end
Dorel Lucanu Algoritmica si programare
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
DT
Dorel Lucanu Algoritmica si programare
Determinarea componentelor tare conexe
procedure DfsCompTareConexe(D)begin
for i ← 0 to n-1 do culoare[i] ← 0tata[i] ← -1
k ← 0timp ← 0for i ← 0 to n-1 do
if (culoare[i] = 0)then DfsRecCompTareConexe(i)
end
Dorel Lucanu Algoritmica si programare
Determinarea componentelor tare conexe
procedure DfsRecCompTareConexe(i)begin
timpVizita[i] ← timp ← timp + 1culoare[i] ← 1for (fiecare virf j in listaDeAdiac(i)) do
if (culoare[j] = 0)then tata[j] ← i
DfsRecCompTareConexe(j)timpFinal[i] ← timp ← timp + 1
end
Dorel Lucanu Algoritmica si programare
Determinarea componentelor tare conexe
Notatie:DT = (V, AT), (i, j) ∈ A ⇔ (j, i) ∈ AT
procedure CompTareConexe(D)1. DFSCompTareConexe(D)2. calculeaza DT
3. DFSCompTareConexe(DT) dar considerandin bucla for principala varfurile in ordineadescrescatoare a timpilor finali de vizitaretimpFinal[i]
4. returneaza fiecare arbore calculat la pasul3. ca fiind o componenta tare conexaseparata
end
Dorel Lucanu Algoritmica si programare
Determinarea comp. tare conexe: complexitate
DFSCompTareConexe(D): O(n + m)calculeaza DT: O(m)DFSCompTareConexe(DT): O(n + m)
Total: O(n + m)
Dorel Lucanu Algoritmica si programare
Sortare topologica
< ordine partiala(x0, ..., xn-1 ) sortat topologic daca xi < xj ⇒ i < j{a < z < w < x, b < z < t, c < m < t < p, s < p}
a z w x
b t
c m p
s
1. (s, c, m, b, a, z, t, p ,w, x)2. (a, b, c, s, z, m, w, t, x , p)
Dorel Lucanu Algoritmica si programare
Sortare topologica: utilizand DFS
1. Initializeaza lista de iesire ca fiind vida.2. Apeleaza DFS pentru a calcula
timpFinal[].3. Un varf “terminat” este inserat la inceputul
listei de iesire.
a z w x
b t
c m p
s
(s, c, m, b, a, z, t, p ,w, x)
Dorel Lucanu Algoritmica si programare
Sortare topologica: utilizand BFS
1. Initializeaza lista de iesire ca fiind vida.2. Initializeaza coada cu varfurile sursa.3. Extrage din coada varful u si-l adauga la
sfarsitul listei de iesire.4. Elimina toate arcele de forma (u,v); daca
pentru un astfel de v lista de adiacenta interioara devine vida, atunci adauga v la coada.
5. Repeta pasii 3 si 4 pina cand coada devine vida.