Sunteți pe pagina 1din 59

3.

Parcurgerea grafurilor

1. Parcurgerea in adâncime
2. Parcurgerea in lațime
3. Inchiderea tranzitiva a unui graf.
4. Sortarea topologica
Fie G=(V,U) graf neorientat sau neorientat. Prin parcurgerea grafului G
se înțelege vizitarea, într-un mod sistematic, a tuturor nodurilor, plecând
de la un nod xp (nod de plecare) mergând pe muchii incidente două câte
două.
Un graf poate fi parcurs în următoarele două moduri:
- în lățime (BFS = Breadth First Search)
- în adâncime (DFS = Depth First Search)

Parcurgerea grafurilor orientate poate fi:


a) Se ia in considerație direcția arcului
b) Nu se ia in considerație direcția arcului
PARCURGEREA ÎN LĂȚIME (BFS)
Fie G=(V, U) un graf cu n vârfuri şi m muchii.
Algoritmul-de parcurgere a grafului în lățime, folosind o coadă, este:
- inițial toate nodurile se consideră nevizitate;
- se citește nodul de plecare xp, care se consideră acum vizitat, şi se trece
in coadă pe, prima poziție;
- se trec in coadă toate nodurile nevizitate până in prezent şi sunt
adiacente cu nodul de plecare (odată cu trecerea lor in coadă se
marchează ca fiind vizitate);
- se trece la următorul element din coadă, care ia rolul nodului de
plecare, şi se reia pasul anterior;
................................
- algoritmul se termină după ce sunt parcurse toate elementele din
coadă.
Exemplul. Parcurgerea in lățime, a grafului, presupune parcurgerea
etapelor:
*La început, nici un nod nu este vizitat (graful arată ca in figura inițială,
adică nici un nod nu este încercuit).
* Se pleacă de la nodul 1, care se trece in coadă pe prima poziție şi se
marchează ca fiind vizitat.

p=u

1
* Se vizitează toate nodurile adiacente cu 1

1 2 3 4
* Se trece la următorul element din coadă și acesta este 2. Dar toate
nodurile adiacente sunt vizitate.

1 2 3 4
* Se trece la următorul element din coadă și acesta este 3. Adiacent
este nodul 6 se include in coadă.

1 2 3 4 6
* Se trece la următorul element din coadă și acesta este 4. Adiacent
este nodul 5 se include in coadă.

p
1 2 3 4 6 5
* Se trece la următorul element din coadă și acesta este 6. Noduri
nevizitate nu mai sunt

1 2 3 4 6 5
* Se trece la următorul element din coadă și acesta este 5. Noduri
nevizitate nu mai sunt. S-au vizitat toate nodurile din coadă.

p u

1 2 3 4 6 5
Parcurgerea in adâncime (DFS)
Fie G =(V, M) un graf cu n vârfuri (V={1 ,2, .... n} ) şi m muchii.
Parcurgerea începe de la un varf de start, nu obligatoriu 1.
• Se vizitează primul vecin nevizitat, al vârfului de start. Vârful y
este considerat vecin al vârfului, dacă exista muchia (x,y).
• Se caută vecini nevizitați a lui y. De exemplu z
• Se caută vecini nevizitați a lui z. ș.a.m.d.
• Daca z nu mai are vecini nevizitați, atunci sunt căutați vecini
nevizitați a lui y, ș.a.m.d.
• Se procedează așa pană nu rămân noduri nevizitate
Exemplu. Incepem cu varful 1
DFS={1,
Exemplu. DFS={1, 2
Exemplu. DFS={1, 2,3,
Exemplu. DFS={1, 2,3,4
Exemplu. DFS={1, 2,3,4,5
Exemplu. DFS={1, 2,3,4,5,6}
BFS={1,2,7,3,4,8,5,9,10,6}
DFS={1,2,3,4,7,8,5,6,9,10}
BFS={1,2,7,3,4,8,5,9,10,6}
DFS={1,2,3,4,7,8,5,6,9,10}
BFS={1,2,5,3,4,8,5,9,10,6}
DFS={1,2,3,4,7,8,5,6,9,10}
BFS={1,2,5,7,4,8,5,9,10,6}
DFS={1,2,3,4,7,8,5,6,9,10}
BFS={1,2,5,7,3, 4,8,5,9,10,6}
DFS={1,2,3,4,7,8,5,6,9,10}
BFS={1,2,5,7,3, 4,8,5,9,10,6}
DFS={1,2,3,4,7,8,5,6,9,10}
BFS={1,2,5,7,3, 4,6,5,9,10,6}
DFS={1,2,3,4,7,8,5,6,9,10}
BFS={1,2,5,7,3, 4,6,8,9,10,6}
DFS={1,2,3,4,7,8,5,6,9,10}
BFS={1,2,5,7,3, 4,6,8,9,10,6}
DFS={1,2,3,4,7,8,5,6,9,10}
BFS={1,2,5,7,3, 4,6,8,9,10}
DFS={1,2,3,4,7,8,5,6,9,10}
BFS={1,2,5,7,3, 4,6,8,9,10}
DFS={1,2,3,4,7,8,5,6,9,10}
BFS={1,2,5,7,3, 4,6,8,9,10}
DFS={1,2,3,4,7,8,5,6,9,10}
BFS={1,2,5,7,3, 4,6,8,9,10}
DFS={1,2,3,4,7,8,5,6,9,10}
BFS={1,2,5,7,3, 4,6,8,9,10}
DFS={1,2,3,4,7,8,5,6,9,10}
BFS={1,2,5,7,3, 4,6,8,9,10}
DFS={1,2,3,4,7,8,5,6,9,10}
BFS={1,2,5,7,3, 4,6,8,9,10}
DFS={1,2,3,4,7,8,5,6,9,10}
BFS={1,2,5,7,3, 4,6,8,9,10}
DFS={1,2,3,4,7,8,5,6,9,10}
BFS={1,2,5,7,3, 4,6,8,9,10}
DFS={1,2,3,4,7,8,5,6,9,10}
BFS={1,2,5,7,3, 4,6,8,9,10}
DFS={1,2,3,4,7,8,5,6,9,10}
BFS={3,1,2,5,4,6,7}
DFS={3,1,2,4,5,6,7}
Inchiderea tranzitivă a unui graf
Dacă G = ( X,U ) este un graf neorientat, atunci pentru orice x, y∈ X ,
Considerăm
1, 𝑑𝑎𝑐𝑎 𝑒𝑥𝑖𝑠𝑡𝑎 𝐿 = [𝑥 = 𝑥0 , 𝑥1 , … , 𝑥𝑟 = 𝑦]
𝑙 𝑥, 𝑦 = ቊ
0, 𝑑𝑎𝑐𝑎 𝑛𝑢 𝑒𝑥𝑖𝑠𝑡𝑎 𝑙𝑎𝑛𝑡 𝑖𝑛𝑡𝑟𝑒 𝑥 𝑠𝑖 𝑦
Definiție. Fie G = ( X,U ) un graf neorientat sau orientat cu n noduri si
presupunem că X = {x1 x2,..., xn }. Definim matricea LG (lij) 1≤I,j≤n. care are
valorile 0 si 1, definită pentru 𝑙𝑖𝑗 = 𝑥𝑖 , 𝑥𝑗 Matricea LG se numeste
matricea lanțurilor grafului G .
Matricea lanturilor se mai numeste si matricea inchiderii tranzitive a
unui graf. Cu alte cuvinte elementul matricei L(i,j) este 1, daca intre
varfurile xi și xj exestă lanț.
In mod analogic se defineste matricea drumurilor pentru un graf
orientat.
Determinarea matricei lanturilor (drumurilor)

Definim următoarele operații:


• Adunarea logică, + :{0,1}×{0,1}→{0,1}, definită prin a + b = a ∨ b ,
pentru orice a,b∈{0,1} , unde ∨ este operația uzuală de disjuncție
logică (sau logic);
• Înmulțirea logică * :{0,1}×{0,1}→{0,1} , definită prin ab = a ∧ b , pentru
orice a,b∈{0,1} , unde ∧ este operația uzuală de conjuncție logică (si logic).
Propoziția 1. Fie G = ( X,U ) un graf neorientat, A matricea sa de adiacență si L
matricea lanțurilor lui G . Atunci are loc relația:
𝑛−1

𝐿 = ෍ 𝐴𝐾
𝑘=1
calculele fiind realizate folosind operațiile logice + si * .
Exemplu.
Suma celor patru matrici

Observam ca matricea lanturilor este simetrica


Determinarea matricei lanturilor sau a drumurilor
se realizeaza conform algoritmului Roy-Warshall.
1. L(i,j)=A(i,j) pentru i,j=1,n.
2. Pentru fiecare vârf intermediar k=1,n, se determină
L(i,j)=(L(i,j) sau (L(i,k) si L(k,j)))
Secventa de cod care determina matricea
lanțurilor
void rw()
{int i,j, k;
for(k=1;k<=n;k++)
{for(i=1;i<=n;i++)
{for(j=1;j<=n;j++)
if(i!=j)
{if(L[i][j]==0)
{L[i][j]=L[i][k]*L[k][j];
}}
4. Sortarea topologica

Sortarea topologică se realizează pentru grafurile orientate aciclice.


Acesta consta in a numerota varfurile grafului in asa fel incat, daca
exista arcul (x,y), atunci numărul x trebuie sa fie mai mic decat y.
In caz daca graful este ciclic astfel de sortare nu este posibila.
Algoritmul de sortare topologica:
1. Se incepe numerotarea cu varful care are gradul interior zero. In caz
daca sunt mai multe varfuri este ales unul din ele.

2.Se construeste subgraful, din care a fost lichidat varful numerotat.

3. Se numerotează varful din subgraful obținut care are gradul interior


zero.

4. Se repeta pasul 2 si 3 pana se numerotează toate varfurile


Observație. Ordinea topologică a varfurilor nu este
unică
Exemplu. Numerotați vârfurile în ordine
topologică.

1 4 7

3 5
8
2
6
Exemplu. Numerotați vârfurile în ordine
topologică.
1
2
3
4
a
5 c 6

8
d
7
1 3 2

5 6
8
4
7

S-ar putea să vă placă și