curs 4dorel lucanu algoritmica si programare curs 4 grafuri tipul abstract graf tipul abstract...

40
Dorel Lucanu Algoritmica si programare Curs 4 Grafuri tipul abstract Graf tipul abstract Digraf implementarea cu matrici de adiacenta implementarea cu liste de adiacenta inlantuite Algoritmi de parcurgere (DFS, BFS) determinarea componentelor (tare) conexe sortare topologica

Upload: others

Post on 28-Jan-2020

25 views

Category:

Documents


1 download

TRANSCRIPT

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.

Dorel Lucanu Algoritmica si programare

Sortare topologica: utilizand BFS

a z w x

b t

c m p

s

(a, b, c, s, z, m, w, t, x , p)