Grafuri de tip arbore

Download Report

Transcript Grafuri de tip arbore

Grafuri de tip
arbore
? ? ?
?

G1
Graful 𝐺 = (𝑉, 𝐸) este arbore dacă este aciclic şi conex.
22
66
11
33
G3
66
44
33
22
G4
99
88
77
99
22
66
44
11
33
88
55
44
33
77
55
66
11
99
22
11
88
55
44
G2
77
77
55
99
88

Fie 𝐺 = (𝑉, 𝐸) un graf arbore.
Subgraful 𝐻 = 𝑉1 , 𝐸1 al lui 𝐺 este subarbore dacă este de tip arbore.
G
22
66
33
H2
88
55
44
11
H1
77
66
44
H3
99
88
77
88
55
44
33
77
55
66
11
99
22
22
99
66
77
55
99
88

Fie 𝐺 = (𝑉, 𝐸) un graf. Următoarele afirmații sînt echivalente:
 G este graf arbore (aciclic şi conex);
 G este graf conex minimal
 G este graf aciclic maximal
G
22
66
44
11
33

Cum verificăm dacă un graf este arbore?
 Verificare conexitate + verificare aciclicitate (alg. Marimont)
 Verificare aciclicitate şi n = m + 1
 Verificare conexitate şi n = m + 1
77
88
55
99
𝑛=9
𝑚=8

Fie un digraf 𝐷 = 𝑉, 𝐸 .
 Digraful 𝐷 este graf asimetric dacă pentru orice 𝑢𝑣 ∈ 𝐸, 𝑣𝑢 ∉ 𝐸.
 Digraful 𝐷 este graf simetric dacă pentru orice 𝑢𝑣 ∈ 𝐸 şi 𝑣𝑢 ∈ 𝐸.
77
D1
22
77
66
55
11
44
33
D2
22
66
44
11
33
55

Fie un digraf netrivial 𝐷 = 𝑉, 𝐸 .
 Graful 𝐺 = (𝑉, 𝐸 ′ ) unde 𝐸 ′ = 𝑢𝑣 𝑢𝑣 ∈ 𝐸 𝑠𝑎𝑢 𝑣𝑢 ∈ 𝐸}
se numește graf suport al digrafului 𝐷.
77
D
77
22
66
44
11
33
G
22
66
55
55
11
44
33

Un arbore direcţionat este un graf orientat asimetric pentru care graful suport
corespunzător este graf arbore.

Arborele direcţionat 𝑇 = (𝑉, 𝐸) este arbore cu rădăcină dacă există 𝑟 ∈ 𝑉
astfel încît, pentru orice 𝑢 ∈ 𝑉, 𝑢 ≠ 𝑟, există 𝑟 − 𝑢 drum în 𝑇. Vîrful 𝑟 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).

Fie 𝑇 = (𝑉, 𝐸) arbore direcţionat. Arborele 𝑇1 = (𝑉1 , 𝐸1 ) este subarbore al lui 𝑇
dacă 𝑉1 ⊆ 𝑉, 𝐸1 ⊆ 𝐸 şi 𝑇1 este arbore direcţionat.

Un arbore orientat este un arbore direcţionat cu rădăcină.

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ă de nivel 0.
G1
11
44
22
33
55
GS
88
22
11
77
44
33
10
10
99
66
55
88
10
10
99
66
11
11
77
77
44
22
33
55
77
G2
88
44
22
33
10
10
66
99
55
88
10
10
66
99

Se pot folosi toate tipurile de reprezentare a grafurilor, plus metode specifice
arborilor, mai eficiente.

11
Reprezentarea Fiu-Frate
11
 N: numărul de noduri
22
 R: nodul rădăcină
33
44
22
33
44
 Fiu(i): eticheta ataşată primului descendent al vîrfului i
88
88
55
66
77 ataşată vîrfului
55
66
7vîrfului
 Frate(i):
eticheta
descendent
al tatălui
i şi care
7
urmează imediat lui i
 Inf(i): informaţia ataşată vîrfului i
99 10
11
99 10
14
16
10 lipsă:
11 12
12se13
13foloseşte
10 11
11 12
12
13
14 o15
15
16
 Valoare
valoare
convenţională
(0, 13
-1…)
14
14
15
15
16
16
𝑁 = 16
 𝑅=1

1
 𝐹𝑖𝑢
= 2
𝐹𝑟𝑎𝑡𝑒 = 0
2 3
5 0
3 4
4
8
0
5 6 7
0 9 0
6 7 0
8
9
14 0
0 10
10
0
11
11 12
0
0
12 13
13
0
0
14 15
0
0
15 16
16
0
0
11

Cum se determină descendenții unui nod?
22

44
Cum se determină părintele unui nod?
55

33
66
88
77
Cum se adaugă un nod în arbore?
99
10
10
11
11
12
12
13
13
14
14
15
15
16
16
Adresa nod
rădăcină

Reprezentarea cu structuri dinamice
Adresa Adresa Adresa
1 ?
Null
Null
fiu 1 pentru
fiu 2
fiu 3fiecare nod: 𝒏
 Număr limitat de descendenți
Adresa Adresa Adresa
Adresa
mică
2  ? 𝒏 are valoare Null
Null
3 ?
Null
Null
Null
Null
Null
4 ?
Null
fiu 1
fiu 2
fiu 3
fiu 1
 Pentru fiecare vîrf se alocă dinamic o structură Adresa
de tipul
Adresa Adresa
7
?
Null
Null
Null
Null
8
Null
?
fiu 1
fiu 2
Adrese descendenți
Adresa Adresa Adresa Adresa Adresa
Identificator
6 ? Informații
fiu 1
fiu 2
fiu 3
fiu 4
fiu 5
vîrf
vîrf
Adresa fiu 1 Adresa fiu 2
...
5
?
Null
Null
Null
Null
Null
16
?
12
11
?
Null
Null
Null
Null
Null
?
Null
Null
Null
Null
?
Null
Null
Null
Null
Null
Null
Null
Null
Null
Null
10
9
?
?
99
Null
Null
Null
Null
Null
Null
Null
Null
Null
Null
Null
Null
Null
?
Null
Null
Null
Null
Null
Null
Null
Null
Null
 Pentru a cunoaște arborele: adresa nodului rădăcină
13
?
Null
Null
Adresa fiu n
15
14
fiu 3
Null
Null

Aplicarea sistematică a unei reguli de vizitare a nodurilor arborelui

Variante adaptate ale parcurgerii grafurilor:
 În lățime (BF)
▪ Parcurgere pe niveluri
 În adîncime (DF)
▪ Parcurgerea în A-preordine
▪ Parcurgerea în A-postordine

Pe niveluri (reprezentare Fiu-Frate)
parcurgere_pe_niveluri( R, FIU[], FRATE[], n )
11
{ Coadă C = NULL;
adaugă ( C, R );
22
33
cît timp ( C )
{ extrage( C, v );
Prelucrează( v );
55
66
77
v = FIU[v];
cît timp ( v )
{ adaugă( C, v);
v = FRATE[v];
99 10
10 11
11 12
12 13
13
}
}
}
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16
44
88
14
14
15
15
16
16

Pe niveluri (reprezentare cu structuri dinamice)
11
parcurgere_pe_niveluri( R )
{ Coadă C = NULL;
22
33
adaugă ( C, R );
cît timp ( C )
{ extrage( C, v );
55
66
77
Prelucrează( v );
pentru ( i=0,n-1 )
dacă ( v->fiu[i])
99 10
adaugă( C, v->fiu[i]);
10 11
11 12
12 13
13
}
}
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16
44
88
14
14
15
15
16
16

A-preordine (reprezentare Fiu-Frate)

Se vizitează nodul curent și se identifică descendenții săi. Se aplică aceeași regulă, pe rînd,
pentru fiecare din subarborii care au ca rădăcină unul din descendenții nodului curent.
11
A_preordine ( R )
{ dacă ( R )
{ Prelucrează ( R );
A_preordine( FIU[R] );
A_preordine( FRATE[R] );
}
}
22
55
99
33
66
10
10
11
11
44
88
77
12
12
13
13
1, 2, 5, 6, 9, 10, 11, 12, 13, 7, 3, 4, 8, 14, 15, 16
14
14
15
15
16
16

A-postordine (reprezentare Fiu-Frate)

Se identifică descendenții nodului curent și se vizitează, pe rînd, fiecare din subarborii care au
ca rădăcină unul din descendenții nodului curent, apoi se vizitează nodul curent. Pentru fiecare
subarbore se aplică aceeași regulă.
11
A_postordine ( R )
{ dacă ( R )
{ A_postordine( FIU[R] );
Prelucrează ( R );
A_postordine( FRATE[R] );
}
}
22
55
99
33
66
10
10
11
11
44
88
77
12
12
13
13
5, 9, 10, 11, 12, 13, 6, 7, 2, 3, 14, 15, 16, 8, 4, 1
14
14
15
15
16
16

Parcurgeri în adîncime (reprezentare cu structuri dinamice)
A_preordine ( R )
{ dacă( R )
{ Prelucrează( R );
pentru( i=0,n-1)
A_preordine( R->fiu[i] );
}
}
A_postordine ( R )
{ dacă(R)
{ pentru( i=0,n-1 )
A_postordine( R->fiu[i] );
Prelucrează( R );
}
}
11
22
55
99
33
66
10
10
11
11
44
88
77
12
12
13
13
14
14
15
15
16
16

Fie 𝐺 = (𝑉, 𝐸) un graf. Subgraful parţial 𝐻 = (𝑉, 𝐸0 ) este un arbore parţial al
lui 𝐺 dacă 𝐻 este graf arbore.

Fie 𝐺 = (𝑉, 𝐸, 𝑤) un graf ponderat conex.
Dacă 𝑇 = (𝑉, 𝐸0 ) este un arbore parţial al grafului 𝐺′ = (𝑉, 𝐸),
ponderea arborelui 𝑇, notată 𝑊(𝑇), este definită prin
𝑊(𝑇) =
𝑤 𝑒
𝑒∈𝐸0

Arborele parţial 𝑇0 ∈ 𝑇 𝐺 este arbore parţial minim pentru 𝐺 dacă
𝑊 𝑇0 = min 𝑊 𝑇
𝑇∈𝑇 𝐺
unde 𝑇 𝐺 este mulţimea arborilor parţiali corespunzători grafului 𝐺.
77
2
22
G
1
3
5
2
3
3
11
4
2
44
66
1
T1
6
55
77
W(T1)=18
W(T1)=18
22
66
5
3
3
11
4
44
2
55
1
66
3
33
W(T2)=20
W(T2)=20
22
T2
3
33
77
2
1
5
3
66
44
T3
6
55
11
77
W(T3)=17
W(T3)=17
22
2
6
2
55
3
11
44
3
33
33

Problemă
 determinarea arborelui parţial de cost minim 𝑇 = (𝑉, 𝐸0 ) al grafului 𝐺 = (𝑉, 𝐸)

Algoritm:
 𝐸0 se iniţializează ca mulţime vidă
 Repetă de 𝑛 − 1 ori
▪ Dintre arcele disponibile (care nu au fost analizate încă) se alege arcul 𝒆
cu ponderea cea mai mică şi care nu formează un ciclu prin adăugare la
arbore.
▪ 𝐸0 ← 𝐸0 ∪ 𝑒
77
2
22
G
1
3
5
2
3
3
11
44
4
2
66
6
55
3
33
Nr. arce
adăugate
Pas
curent
i j
0
1
2
3
4
5
6
1
2
3
4
5
5
6
arc
(6,7)
(2,5)
(2,7)
(4,5)
(1,2)
(1,4)
(3,5)
Tata:
(
(
(
(
(
(
(
(
6
2
2
4
1
1
3
3
3
4
5
7
5
7
5
2
4
5
7
4
6
6
1
2
2
2
3
3
3
3
4
5
6







1 2 3 4 5 6 7
-1 -1 -1 -1 -1 -1 -1 )
-1 -1 -1 -1 -1 7 -2 )
-1 5 -1 -1 -2 7 -2 )
-1 5 -1 -1 7 7 -4 )
-1 5 -1 7 7 7 -5 )
7 5 -1 7 7 7 -6 )
7 7 -1 7 7 7 -6 )
7 7 7 7 7 7 -7 )
77
22
T
2
1
2
3
11
44
2
3
33
cost
1
2
2
2
3
3
66
total
0
1
3
5
7
10
10
13
55

Funcţie pentru determinarea rădăcinii
int radacina( int v, int tata[])
{ int u;
u = v;
while( tata[u] >= 0 )
u = tata[u];
return u;
}
Ex.: v = 2
u = 2 tata[2]=5
u = 5 tata[5]=7
u = 7 tata[7]=-4 < 0
1
( -1
2
5
3
-1
4
-1
5
7
6
7
7
-4 )
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; 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;
}

Problemă
 determinarea arborelui parţial de cost minim 𝑇 = (𝑉, 𝐸0 ) al grafului 𝐺 = (𝑉, 𝐸)

Algoritm:
 𝐸0 se iniţializează ca mulţime vidă
 Alege un vîrf inițial oarecare 𝑣0 ∈ 𝑉, 𝐴 = 𝑣0 , 𝐵 = 𝑉 − 𝐴
 Repetă de 𝑛 − 1 ori
▪ Alege muchia 𝑒 = (𝑢, 𝑣) cu cea mai mică pondere a.î. 𝑢 ∈ 𝐴 și 𝑣 ∈ 𝐵
▪ 𝐸0 ← 𝐸0 ∪ 𝑒
▪ 𝐴←𝐴∪ 𝑣
▪ 𝐵←𝐵− 𝑣
77
2
22
G
1
3
5
2
3
3
11
4
44
2
66
6
77
55
2
22
1
3
3
33

Temă:
 Implementați algoritmul Prim
 Prim sau Kruskal?
2
3
11
44
33
66
2
55