160 likes | 386 Views
PARCURGEREA GRAFURILOR NEORIENTATE. Obiective. No ţ iuni teoretice despre parcurgeri (semnificaţie, mod de realizare, scop); Metode de parcurgere ; Parcurgerea în “lăţime” (prezentarea metodei, exemple); Algoritmul BF. END. Parcurgere (noţiuni teoretice).
E N D
Obiective Noţiuni teoretice despre parcurgeri(semnificaţie, mod de realizare, scop); Metode de parcurgere; Parcurgerea în “lăţime” (prezentarea metodei, exemple); Algoritmul BF. END
Parcurgere(noţiuni teoretice) Semnificaţie: examinarea în mod sistematic a nodurilor unui graf; Realizare: se pleacă dintr-un nod dat i, astfel încât fiecare nod accesibil din i pe muchii incidente două câte două, să fie atins o singură dată. Alte expresii similare: vizitare, traversare. Scop: prelucrării informaţiilor asociate nodurilor; determinarea aranjării lineare a nodurilor în vederea trecerii de la unul la altul Observaţii: Presupunem că mulţimea vârfurilor este X={1, 2, … , n}; Presupunem că ordinea vârfurilor este dată de relaţia „<”, existentă în mulţimea numerelor naturale.
Metode de parcurgere Parcurgere în „lăţime” (Breadth First - BF) Parcurgerea în „adâncime” (Depth First - DF)
Parcurgerea în „lăţime”Breadth First - BF Se vizitează vârful iniţial x, apoi vecinii acestuia, apoi vecinii nevizitaţi ai acestora, şi aşa mai departe. Exemplu: Pentru graful din figura următoare ordinea de parcurgere a nodurilor cu metoda BF, când se pleacă din vârful 1 este următoarea: 1 1, 2, 3, 4, 5. 2 3 4 5
1 Pentru acelaşi graf, dacă se pleacă din nodul iniţial 5, ordinea de parcurgere “în lăţime” este următoarea: Dacă se pleacă din nodul 2, lista vârfurilor obţinută în urma parcurgerii BF este următoarea: 5, 2, 1, 4, 3. 2 3 4 2, 1, 4, 5, 3. 5
#include <iostream.h> void main (void) { int a[20][20],trecut[20],n,i,j,u,pc, m,e1,e2,x,sol[20]; cout<<"numarul de noduri: "; cin>>n; cout<<"numarul de muchii: "; cin>>m; for (i=1;i<=n;i++) for (j=1;j<=n;j++) a[i][j]=0; for (i=1;i<=m;i++) { cout<<"Muchia "<<i<<":\n"; cout<<"e1="; cin>>e1; cout<<"e2="; cin>>e2; a[e1][e2]=a[e2][e1]=1; } for (i=1;i<=n;i++) trecut[i]=0; cout<<"Nodul initial: "; cin>>x; pc=1; u=1; sol[1]=x; trecut[x]=1; while (u<n) { for (i=1;i<=n;i++) if (a[sol[pc]][i] && !trecut[i]) { u++; sol[u]=i; trecut[i]=1; } pc++; } cout<<"Parcurgerea BFS:"; for (i=1;i<=n;i++) cout<<sol[i]<<','; cout<<'\b'; } Algoritmul BF (programul C++)
Variabilele utilizate în programul C++ a - matricea de adiacenţă asociată grafului; trecut -vector în care se trec în ordine nodurile”parcurse”; n - numărul de noduri din graf; m - numărul de muchii din graf; e1,e2 - extremităţile muchiilor; i,j - contori; x– nodul din care se „pleacă”; u - variabilă (contor) ce ţine evidenţa numărului de noduri vizitate; pc - nodul ai cărui vecini îi căutăm; sol- vectorul rezultat în urma parcurgerii (conţine nodurile în ordinea vizitării lor).
Vectorul trecut care are n componente este definit astfel: Deoarece algoritmul conţine două cicluri imbricate: unul while (care se execută de cel mult n-1 ori) şi unul for (care se execută de n ori) rezultă că ordinul de complexitate al algoritmului este O(n2).
2 4 5 10 3 9 8 1 7 11 12 6 Aplicaţie: Fie graful din figura de mai jos. Se cere să se realizeze parcurgerea în “lăţime” pornind pe rând din nodurile: 1, 12, 4, 7, 8, 5 şi 10.