Table of Contents

Laboratorul 8: Grafuri

1. Obiectivele laboratorului

Structura laboratorului se gaseste in acest link.

2. Grafuri neorientate

2.1. Definitie

Un graf neorientat este o pereche ordonată de multimi(X,U),unde:

2.2. Structura

Un graf are următoarele elemente:

2.3. Reprezentare

Având lista de adiacentă:

Un graf parțial este un graf obținut din graful inițial prin eliminarea uneia sau mai multor muchii

Un subgraf este un graf obținut din graful inițial prin eliminarea unui număr de noduri impreună cu muchiile formate cu acele noduri

Se numește lanț într-un graf,o succesiune de vârfuri L={v1,v2,…,vk},cu proprietatea că oricare două vârfuri consecutive sunt adiacente,adică există o muchie între acestea. Se numeşte lanţ elementar un lanţ în care nu se repetă vârfuri.

Se numeşte lanţ simplu un lanţ în care nu se repetă muchii.

Se numeşte ciclu un lanţ simplu pentru care primul şi ultimul vârf coincid.

Se numeşte ciclu elementar un ciclu în care nu se repetă vârfuri(excepţie primul şi ultimul).

3. Grafuri orientate

3.1. Definitie

Un graf orientat este o pereche ordonată de multimi(X,U),unde:

3.2. Structura

Într-un graf orientat, distingem:

3.3. Reprezentare

4.Parcurgerea grafurilor

Parcurgere (traversal) = metoda de vizitare sistematica a fiecarui varf sau arc din graf.

Parcurgerile pot sa tina loc de cautare (Search/Traversal)

Tipuri de parcurgeri:

4.1.Parcurgerea în lățime

Parcurgerea in latime (Breadth First Traversal) a unui graf e similara cu parcurgerea pe niveluri a unui arbore cu diferenta ca intr-un graf putem sa avem cicluri. Parcurgerea în lățime (Breadth-First-Search -BFS) este o metodă ce presupune vizitarea nodurilor în următoarea ordine:

4.1.1 Implementare

Pe masură ce algoritmul avansează,se colorează nodurile în felul următor:

Pentru implementarea BFS se utilizează o coadă (Q) în care inițial se află doar nodul sursă.Se vizitează pe rând vecinii acestui nod și se pun și ei în coadă.În momentul în care nu mai există vecini nevizitați,nodul sursă este scos din coadă.

Pentru fiecare nod u din graf
{
     culoare[u]=alb
     d[u] = infinit    //in d se retine distanta pana la nodul sursa
     p[u] = null       //
}
 
culoare[sursă]=gri
d[sursă]=0
enqueue(Q,sursă)     //punem nodul sursă în coada Q
 
Cât timp coada Q nu este vidă
{
     v=dequeue(Q)   //extragem nodul v din coadă
     pentru fiecare u dintre vecinii lui v
          dacă culoare[u] == alb
          {
               culoare[u] = gri
               p[u] = v
               d[u] = d[v] + 1
               enqueue(Q,u)   //adăugăm nodul u în coadă
          }
     culoare[v] = negru   //am terminat explorarea vecinilor lui v
}

Aplicatii BFS/T

4.2.Parcurgerea în în adâncime

Parcurgea în adâncime (Depth-First-Search -DFS) presupune explorarea nodurilor în următoarea ordine:

Această metoda de parcurgere pune prioritate pe explorarea în adâncime (pe distanțe tot mai mari față de nodul sursă).

4.2.1 Implementare

Spre deosebire de BFS, DFS utilizează o stivă în loc de o coadă. Putem defini o stivă sau ne putem folosi de stiva compilatorului, prin apeluri recursive.

funcţie pasDFS(curent)
{
	pentru fiecare u dintre vecinii nodului curent
          dacă culoare[u] == alb
          {
               culoare[u] = gri
               p[u] = curent
               d[u] = d[curent] + 1
               pasDFS(u);   //adăugăm nodul u în "stivă" şi începem explorarea
          }
	culoare[curent] = negru   //am terminat explorarea vecinilor nodului curent
	//ieşirea din funcţie este echivalentă cu eliminarea unui element din stivă
}
Pentru fiecare nod u din graf
{
     culoare[u]=alb
     d[u] = infinit    //in d se retine distanta pana la nodul sursa
     p[u] = null
}
culoare[sursă] = gri;
d[sursă] = 0;
 
//se apelează iniţial pasDFS(sursă)

Aplicatii DFS/T

5. Exercitii

Implementaţi, pentru fiecare cerinţă, câte o funcţie care:

OBS - Cerintele 2, 3, 4 se vor folosi de matricea de adiacenţă a grafului de la cerinţa 1.