Structuri arborescente

Download Report

Transcript Structuri arborescente

Slide 1

Structuri arborescente
(grafuri de tip arbore)


Slide 2

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

1

1
2

4

3

4

2

7
5

5

1

3

6
7

7

4

3

7

2
5

9

6
8


Slide 3

Structuri arborescente
• Definiţie. Fie 𝐺 = (𝑉, 𝐸) graf arbore. Subgraful 𝐻 = (𝑉1, 𝐸1)
al lui 𝐺 este subarbore al lui 𝐺 dacă 𝐻 este graf arbore.
1

1

2

2
8
3

𝑮

3
4

𝑯𝟏

5
6

4
5

7

6

9

9

1

1

2

2
8
3

𝑯𝟐

3
4

𝑯𝟑

5
6

7

9

4


Slide 4

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:
𝑛 = 9prin adăugarea unei noi
muchii în graf rezultă cel
𝑚 puţin
= 8 un ciclu.
1
• Cum verificăm dacă un graf2 este arbore?
– Verificare conexitate + verificare aciclicitate (alg. Marimont) 8
– Verificare aciclicitate şi 𝑛 = 𝑚 +13 (n – nr. vîrfuri, m – nr. muchii)
4
– Verificare conexitate şi 𝑛 = 𝑚 +1
5
6

7

9


Slide 5

Structuri arborescente
• Definiţie. Se numeşte graf asimetric un digraf 𝐷 = (𝑉, 𝐸) cu
proprietatea că pentru orice 𝑢𝑣 ∈ 𝐸, 𝑣𝑢 ∉ 𝐸.
• Digraful D este simetric dacă pentru orice 𝑢𝑣 ∈ 𝐸 şi 𝑣𝑢 ∈ 𝐸.
2

2
1

1
5

6

3

3
4

Graf
asimetric

5

6

7

4

7

Graf
simetric


Slide 6

Structuri arborescente
• Definiţie. Fie 𝐷 = (𝑉, 𝐸) digraf netrivial. Graful 𝐺 = (𝑉, 𝐸’),
unde 𝐸’ = {𝑢𝑣|𝑢𝑣𝐸 𝑠𝑎𝑢 𝑣𝑢𝐸} se numeşte graf suport al
digrafului D.
2

Graf suport

1
5

6

2
1

3
4

5

6

7

3
4

7


Slide 7

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 𝑢 ∈ 𝑉,
GS
1
1
𝑢G1≠ 𝑟, există
r-u drum în8 𝑇. Vîrful
r se numeşte
rădăcina8
4
4
arborelui
direcţionat 𝑇 (drumurile2sînt unice, rădăcina este
2
unică; lungimea
unui drum
este egală cu numărul
de arce).
3
7
3
7
G2

1

8

10

1

8

10

4

4

Pentru
un arbore
5
5
2
2
• Definiţie.
Fie 𝑇 = (𝑉, 𝐸) arbore direcţionat.
6
cu rădăcină, 6orice 9 7
Arborele 𝑇31 = (𝑉1,10𝐸1) este
subarbore al lui3 T dacă10
este
rădăcina
𝑉nod

𝑉,
𝐸
𝐸 asimetric
şi T1 este arbore direcţionat.
Graf
orientat
Graf suport
direcţionat
1Arbore
1 ⊆
5
unui5 subarbore.
6

9

Graf orientat
asimetric
Arbore
direcţionat
cu rădăcină

6

9

7

9

Subarbori (G1, G1/G2)


Slide 8

Reprezentări şi parcurgeri (arbori orientaţi)
“…lungimea unui drum
egală
cu numărul
• Definiţie. Un arbore orientat este un este
arbore
direcţionat
cu de
1
1
arce.”
rădăcină.
4 arbore orientat
2
3
4 r. Un
• Definiţie.2 Fie 𝑇 =3(𝑉, 𝐸) un
cu rădăcină
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
5
6
7pe nivelul 0. 8
considerată
5
6
7
8

9

10

11

12

13

14

15 9 16 10

11

12

13

14

15

16

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


Slide 9

Reprezentarea Fiu-Frate
• N: numărul de noduri

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

• R: eticheta nodul rădăcină
• FIU(i): eticheta primului descendent al vîrfului i

Atenție la translația
etichetă
 indice
vector
care
urmează imediat
lui i

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

• INF(i): informaţia ataşată vîrfuluispre
i dreapta, conform
reprezentării grafice
• 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…)


Slide 10

Reprezentarea Fiu-Frate
1

N = 16,
R=1

2

3

4

Putem afla tatăl unui nod?

9

5

6

7

10

11

12

8

13

14

15

Putem afla descendenţii unui nod?
16

1 2 3 4 5 6 7
FIU

8

9 10 11 12 13 14 15 16

=(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)


Slide 11

Reprezentare folosind structuri
dinamice
• Presupunînd că fiecare
vîrf al arborelui are cel mult n
Adr. Adr. Adr.
1 fiu 1 fiu 2 fiu 3 Null Null
descendenţi, fiecărui vîrf îi este asociată structura
2

Adr.
fiu 1

Adr.
fiu 2

Adr.
fiu 3

Null

,

7
6
5

Null

3

Null

Adr.
fiu 1

identificator
Null Null Null Null
vîrf

Null
Adr.
fiu 2

Null

Null

Null

Null

Null

Null

Null

Null

Null

4

Adr.
fiu 1

Null

Null

Null

Null

8

Adr.
fiu 1

Adr.
fiu 2

Adr.
fiu 3

Null

Null

Adr. Adr. de legături către descendenţii vîrfului
vector
fiu 4 fiu 5

Adr.
fiu 3

16

adresă fiu 1



13

Null

Null

Null

Null

12

Null

Null

Null

Null

Null

11

Null

Null

Null

Null

Null

10

Null

Null

Null

Null

Null

Null

Null

Null

Null

Null

15

Null

Null

Null

Null

Null

adresă
fiuNulln
Null Null Null

Null

14

9

Null

Null

Null

Null

Null

Null


Slide 12

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)


Slide 13

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

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

2

9

3

5

6

7

10

11

12

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

4

8

13

14

15

16


Slide 14

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

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

2

9

3

5

6

7

10

11

12

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

4

8

13

14

15

16


Slide 15

Parcurgeri în adîncime (str. dinamice)
void A_preordine (nod R)
{ if (R)
{ vizit (R);
for(i=0;iA_preordine(R->leg[i]);
}
}
void A_postordine (nod R)
{ if (R)
{ for(i=0;iA_postordine(R->leg[i]);
vizit (R);
}
}


Slide 16

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


Slide 17

Parcurgerea pe niveluri (str. dinamice)
void parcurgere_pe_niveluri(nod *R)
{ TNOD* C = NULL;
push(C,R);
while (C)
2
{ pop(C,v);
VIZIT(v);
for(i=0;i5
6
if(R->leg[i])
push(C,R->leg[i]);
}
9
10
11
}
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16

1

3

4

7

12

8

13

14

15

16


Slide 18

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ă
𝑇 = (𝑉, 𝐸0) este un arbore parţial al grafului 𝐺’ = (𝑉, 𝐸),
ponderea arborelui 𝑇, notată 𝑊(𝑇), este definită prin
𝑊(𝑇) =

𝑤(𝑒)
𝑒∈𝐸0

• Definiţie. Arborele parţial 𝑇0 ∈ 𝑇(𝐺) este arbore parţial
minim pentru 𝐺 dacă 𝑊(𝑇0) = min{𝑊(𝑇); 𝑇 ∈ 𝑇(𝐺)}, unde
𝑇(𝐺) este mulţimea arborilor parţiali ai grafului 𝐺.


Slide 19

Arbori parţiali
P = 22

1

1

1

1

4

4
4

4

3
2

3

2

3
3

3

7

8

2

3

8

3

3
6

6

2

5

4

P = 20

2

5

7

4

P = 15

1

7

1

1

1

4
4
2

4
2

3

3

3
7

3
2

3
6

5

6
7

2

3

5

2
4

7


Slide 20

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 𝑛– 1 ori


Slide 21

Algoritmul lui Kruskal
1
4

2

8

Nr. arc
curent

Nr. arce
selectate

0
1
2
3
4
5

0
1
2
3
4
4

5

12

1
4

Arc
curent

i j

8

6
9

2

4

3

2

arc
(2,3)
(1,6)
(2,4)
(1,5)
(3,4)
(1,2)

3
Vectorul
Tata

1

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

2

2
1
2
1
3
1
4
5
3
3

3 1
6 2
4 2
5 3
4 4
2 4
6 8
6 8
6 9
5 12

3

4

v
v
v
v
x
v

1
4

2

6

-1, -1, -1, -1, -1)
-2, 2, -1, -1, -1)
-2, 2, -1, -1, 1)
-3, 2, 2, -1, 1)
-3, 2, 2, 1, 1)
1,

2,

2,

6

2

5

1,

1)

3

2

1

4

3

cost

total

1
2
2
3
4

0
1
3
5
8
8
12

5


Slide 22

Algoritmul lui Kruskal
• 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;
}
1
2
Ex.: v = 4
(-6, 1,
u = 4 tata[4]=2
u = 2 tata[2]=1
u = 1 tata[1]=-6 < 0

3

4

5

6

2,

2,

1,

1)


Slide 23

Algoritmul lui Kruskal
int 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; ifor(i=j=0; j{ 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;
}


Slide 24

Spor la învăţat!