structuri arborescente

24

Click here to load reader

Upload: zareh

Post on 11-Jan-2016

85 views

Category:

Documents


1 download

DESCRIPTION

Structuri arborescente. (grafuri de tip arbore). Structuri arborescente. Definiţi e. Graful este arbore dacă este aciclic şi conex. Structuri arborescente. Definiţi e. Fie graf arbore . Subgraful al lui este subarbore al lui dacă este graf arbore. Structuri arborescente. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: Structuri arborescente

Structuri arborescente

(grafuri de tip arbore)

Page 2: Structuri arborescente

Structuri arborescente

• Definiţie. Graful este arbore dacă este aciclic şi conex.

1

2 3 4

5 6

7

1

2

3

4

5

7

7

1

2

3

4

5

6

7

8

9

Page 3: Structuri arborescente

Structuri arborescente

• Definiţie. Fie graf arbore. Subgraful al lui este subarbore al lui dacă este graf arbore.

12

34

56 7

8

9

12

34

56

9

12

34

56 7

8

9

12

34

𝑮 𝑯𝟏

𝑯𝟐 𝑯𝟑

Page 4: Structuri arborescente

Structuri arborescente

• Fie un graf. Următoarele afirmaţii sînt echivalente:– este graf arbore (aciclic şi conex);– este graf conex minimal: prin eliminarea oricărei muchii,

graful rezultat nu este conex;– este graf aciclic maximal: prin adăugarea unei noi muchii

în graf rezultă cel puţin un ciclu.

• Cum verificăm dacă un graf este arbore?– Verificare conexitate + verificare aciclicitate (alg. Marimont)– Verificare aciclicitate şi 1 (n – nr. vîrfuri, m – nr. muchii)– Verificare conexitate şi 1

12

34

56 7

8

9

Page 5: Structuri arborescente

Structuri arborescente

• Definiţie. Se numeşte graf asimetric un digraf cu proprietatea că pentru orice , .

• Digraful D este simetric dacă pentru orice şi .

1

2

3

4

5 6

7

Graf asimetric

1

2

3

4

5 6

7

Graf simetric

Page 6: Structuri arborescente

Structuri arborescente

• Definiţie. Fie digraf netrivial. Graful , unde se numeşte graf suport al digrafului D.

1

2

3

4

5 6

7

1

2

3

4

5 6

7

Graf suport

Page 7: Structuri arborescente

Structuri arborescente

• Definiţie. Un arbore direcţionat este un graf orientat asimetric pentru care graful suport corespunzător este graf arbore.

• Definiţie. Arborele direcţionat este arbore cu rădăcină dacă există astfel încît, pentru orice , , există r-u drum în . Vîrful r se numeşte rădăcina arborelui direcţionat (drumurile sînt unice, rădăcina este unică; lungimea unui drum este egală cu numărul de arce).

• Definiţie. Fie arbore direcţionat. Arborele este subarbore al lui T dacă , şi T1 este arbore direcţionat. Graf orientat asimetric

1

2

3

4

5

6

7

8

9

10

G1 1

2

3

4

5

6

7

8

9

10

Graf suport

GS

Arbore direcţionat

1

2

3

4

5

6

7

8

9

10

G2

Graf orientat asimetricArbore direcţionat cu rădăcină

1

2

3

4

5

6

7

8

9

10

Subarbori (G1, G1/G2)

Pentru un arbore cu rădăcină, orice nod este rădăcina unui subarbore.

Page 8: Structuri arborescente

Reprezentări şi parcurgeri (arbori orientaţi)

• Definiţie. Un arbore orientat este un arbore direcţionat cu rădăcină.

• Definiţie. Fie un arbore orientat cu rădăcină r. Un vîrf v este situat pe nivelul i al arborelui T, dacă distanţa de la vîrf la rădăcină este egală cu i. Rădăcina arborelui este considerată pe nivelul 0.

• Se pot folosi toate tipurile de reprezentare a grafurilor, plus metode specifice arborilor.

“…lungimea unui drum este egală cu numărul de arce.”

1

32 4

5 6 7 8

9 10 11 12 13 14 15 16

1

32 4

5 6 7 8

9 10 11 12 13 14 15 16

Page 9: Structuri arborescente

Reprezentarea Fiu-Frate

• N: numărul de noduri

• R: eticheta nodul rădăcină

• FIU(i): eticheta primului descendent al vîrfului i

• FRATE(i): eticheta vîrfului descendent al tatălui vîrfului i şi

care urmează imediat lui i

• INF(i): informaţia ataşată vîrfului i

• adesea informaţia e chiar valoarea i, caz în care

vectorul INF nu mai e necesar

• Valoare lipsă (fiu, frate): se foloseşte o valoare

convenţională (0, -1…)

din partea stîngă, conform reprezentării grafice

spre dreapta, conform reprezentării grafice

Atenție la translația etichetă indice vector

Page 10: Structuri arborescente

Reprezentarea Fiu-Frate

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

FIU =(2,5,0,8,0,9,0,14, 0, 0, 0, 0, 0, 0, 0, 0)

FRATE =(0,3,4,0,6,7,0, 0,10,11,12,13, 0,15,16, 0)

1

32 4

5 6 7 8

9 10 11 12 13 14 15 16

N = 16,

R = 1

Putem afla tatăl unui nod?

Putem afla descendenţii unui nod?

Page 11: Structuri arborescente

Reprezentare folosind structuri dinamice

• Presupunînd că fiecare vîrf al arborelui are cel mult n descendenţi, fiecărui vîrf îi este asociată structura

,

identificator vîrf

vector de legături către descendenţii vîrfului

adresă fiu 1 … adresă fiu n

1 Adr.fiu 1

Adr.fiu 2

Adr.fiu 3

Null Null

2 Adr.fiu 1

Adr.fiu 2

Adr.fiu 3

Null Null 3 Null Null Null Null Null 4 Adr.fiu 1

Null Null Null Null

5 Null Null Null Null Null

6 Adr.fiu 1

Adr.fiu 2

Adr.fiu 3

Adr.fiu 4

Adr.fiu 5

7 Null Null Null Null Null

9 Null Null Null Null Null

10 Null Null Null Null Null

11 Null Null Null Null Null

12 Null Null Null Null Null

13 Null Null Null Null Null

8 Adr.fiu 1

Adr.fiu 2

Adr.fiu 3

Null Null

16 Null Null Null Null Null

15 Null Null Null Null Null

14 Null Null Null Null Null

Page 12: Structuri arborescente

Parcurgeri

• Aplicarea sistematică a unei reguli de vizitare a

vîrfurilor arborelui.

• Cele mai utilizate reguli de parcurgere a arborilor

orientaţi sînt

– A-preordine (variantă DF)

– A-postordine (variantă DF)

– parcurgerea pe niveluri (BF)

Page 13: Structuri arborescente

Parcurgerea în A-preordine (Fiu-Frate)

• Se vizitează vîrful curent şi se identifică descendenţii lui. Se aplică aceeaşi regulă de vizitare pentru fiecare dintre arborii avînd ca rădăcini descendenţii vîrfului curent.

void A_preordine (nod R){ if (R) { vizit (R); A_preordine(FIU[R]); A_preordine(FRATE[R]); }

} 1, 2, 5, 6, 9, 10, 11, 12, 13, 7, 3, 4, 8, 14, 15, 16

1

32 4

5 6 7 8

9 10 11 12 13 14 15 16

Page 14: Structuri arborescente

Parcurgerea în A-postordine (Fiu-Frate)

• Se identifică şi se vizitează descendenţii vîrfului curent, apoi se vizitează vîrful curent. Se aplică aceeaşi regulă de vizitare pentru arborii avînd ca rădăcini descendenţii vîrfului curent.

void A_postordine (nod R){ if (R) { A_postordine(FIU[R]); vizit (R); A_postordine(FRATE[R]); }

} 5, 9, 10, 11, 12, 13, 6, 7, 2, 3, 14, 15, 16, 8, 4, 1

1

32 4

5 6 7 8

9 10 11 12 13 14 15 16

Page 15: Structuri arborescente

Parcurgeri în adîncime (str. dinamice)

void A_preordine (nod R){ if (R) { vizit (R); for(i=0;i<n;i++) A_preordine(R->leg[i]); }}

void A_postordine (nod R){ if (R) { for(i=0;i<n;i++) A_postordine(R->leg[i]); vizit (R); }}

Page 16: Structuri arborescente

Parcurgerea pe niveluri (Fiu-Frate)

void parcurgere_pe_niveluri(nod R, int FIU[], int FRATE[], int n){ TNOD* C = NULL; push(C,R); while (C) { pop(C,v); VIZIT(v); v=FIU[v]; while(v) { push(C,v); v=FRATE[v]; } }}1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16

1

32 4

5 6 7 8

9 10 11 12 13 14 15 16

Page 17: Structuri arborescente

Parcurgerea pe niveluri (str. dinamice)

void parcurgere_pe_niveluri(nod *R){ TNOD* C = NULL; push(C,R); while (C) { pop(C,v); VIZIT(v); for(i=0;i<n;i++) if(R->leg[i])

push(C,R->leg[i]); }

}

1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16

1

32 4

5 6 7 8

9 10 11 12 13 14 15 16

Page 18: Structuri arborescente

Arbori parţiali

• Definiţie. Fie un graf. Subgraful parţial este un arbore parţial al lui dacă este graf arbore.

• Definiţie. Fie un graf ponderat conex. Dacă este un arbore parţial al grafului , ponderea arborelui , notată , este definită prin

• Definiţie. Arborele parţial este arbore parţial minim pentru dacă , unde este mulţimea arborilor parţiali ai grafului .

Page 19: Structuri arborescente

Arbori parţiali1

3

2

4

5

6

3

1

278

4

7

24

3

3

3 3

1

3

2

4

5

6

1

27

4

7

3

3

1

3

2

4

5

6

1

2

7

24

33

1

3

2

4

5

6

1

8

4

7

24

3

P = 22

P = 20 P = 15

Page 20: Structuri arborescente

Algoritmul lui Kruskal

Problemă: determinarea arborelui parţial de cost minim al

grafului .Algoritm:

• se iniţializează iar .

• dintre arcele disponibile (neselectate anterior) se alege

arcul cu ponderea cea mai mică şi care nu formează un

ciclu prin adăugare la arbore

• repetă pasul anterior de ori

Page 21: Structuri arborescente

Algoritmul lui Kruskal2 3 11 6 22 4 21 5 33 4 41 2 4 4 6 85 6 83 6 93 5 12

i j arc 1 2 3 4 5 6 cost total (-1, -1, -1, -1, -1, -1) 0

1

2

34

56

1

2

34

56

42

2

8129

8

3

1

4

0 0 (2,3) (-1, -2, 2, -1, -1, -1) 1 1

1

Nr. arc curent

Nr. arce selectate

Arc curent

Vectorul Tata

v

1 1 (1,6) (-2, -2, 2, -1, -1, 1) 2 3

2

v

2

2 2 (2,4) (-2, -3, 2, 2, -1, 1) 2 5

v 3

3 3 (1,5) (-3, -3, 2, 2, 1, 1) 3 8

v4

5 4 (1,2) (-6, 1, 2, 2, 1, 1) 4 12

v

4 4 (3,4) 8

x

Page 22: Structuri arborescente

• Funcţie pentru determinarea rădăcinii

int radacina(int v,int tata[]){ int u = v; while(tata[u] >= 0)

u = tata[u]; return u; }Ex.: v = 4u = 4 tata[4]=2u = 2 tata[2]=1u = 1 tata[1]=-6 < 0

Algoritmul lui Kruskal

1 2 3 4 5 6

(-6, 1, 2, 2, 1, 1)

Page 23: Structuri arborescente

Algoritmul lui Kruskalint kruskal(int a[][3],int nm, int nv, int b[][3]){ int tata[50],i,j, v1, v2, r1, r2; int c=0; for(i=0; i<nv; i++) tata[i]=-1; for(i=j=0; j<nv-1; i++) { v1=a[i][0]; v2=a[i][1]; r1=radacina(v1,tata); r2=radacina(v2,tata); if( r1 != r2 ) { if( tata[r1] < tata[r2] ) { tata[r1]+=tata[r2]; tata[r2]=r1; } else { tata[r2]+=tata[r1]; tata[r1]=r2; } b[j][0]=a[i][0]; b[j][1]=a[i][1]; b[j][2]=a[i]

[2]; c+=a[i][2]; j++; } } return c;}

Page 24: Structuri arborescente

Spor la învăţat!