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

Curs 4Dorel Lucanu Algoritmica si programare Curs 4 Grafuri tipul abstract Graf tipul abstract Digraf implementarea cu matrici de adiacenta implementarea cu liste de adiacentaDorel

  • 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.

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)