This shows you the differences between two versions of the page.
sda-ab:laboratoare:09 [2021/03/06 20:52] smaranda.bogoi |
sda-ab:laboratoare:09 [2021/04/18 11:54] (current) gabriel.rusu [1. Obiectivele laboratorului] |
||
---|---|---|---|
Line 8: | Line 8: | ||
*Modalitati de parcurgere a grafurilor | *Modalitati de parcurgere a grafurilor | ||
- | Structura laboratorului se gaseste in **[[http://gooogle.com|acest link.]]** | + | Structura laboratorului se gaseste in **[[https://github.com/sda-ab/lab-08-tasks|acest link.]]** |
====== 2. Grafuri neorientate ====== | ====== 2. Grafuri neorientate ====== | ||
Line 139: | Line 139: | ||
{{ :sda-ab:laboratoare:bfs.jpg?500 |}} | {{ :sda-ab:laboratoare:bfs.jpg?500 |}} | ||
+ | **Aplicatii BFS/T** | ||
+ | *Gasirea celui mai scurt drum intre 2 varfuri | ||
+ | *Identificarea arborelui minim de acoperire (ca si DFT) | ||
+ | *Identificarea componentelor conexe (ca si DFT) | ||
+ | |||
+ | === 4.2.Parcurgerea în în adâncime === | ||
+ | |||
+ | Parcurgea în adâncime (**Depth-First-Search -DFS**) presupune explorarea nodurilor în următoarea ordine: | ||
+ | *Nodul sursă | ||
+ | *Primul vecin nevizitat al nodului sursă (îl numim V1) | ||
+ | *Primul vecin nevizitat al lui V1 (îl numim V2) | ||
+ | *ș.a.m.d | ||
+ | *În momentul în care am epuizat vecinii unui nod Vn, continuăm cu următorul vecin nevizitat al nodului anterior,Vn-1 | ||
+ | |||
+ | Această metoda de parcurgere pune prioritate pe explorarea **în adâncime** (pe distanțe **tot mai mari față** de nodul sursă). | ||
+ | |||
+ | {{ :sda-ab:laboratoare:dfs.gif?500 |}} | ||
+ | |||
+ | === 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. | ||
+ | |||
+ | <code c> | ||
+ | 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ă) | ||
+ | </code> | ||
+ | |||
+ | {{ :sda-ab:laboratoare:df1.jpg?400 |}} | ||
+ | |||
+ | **Aplicatii DFS/T** | ||
+ | *determinarea unui drum intre 2 varfuri u si v | ||
+ | *daca un graf neorientat este conex sau nu | ||
+ | *daca graful are cicluri | ||
+ | *componente tare conexe in grafuri orientate (**OBS** spunem ca un graf orientat se numeste **tare conex** daca exista drum intre oricare doua varfuri) | ||
+ | *daca un graf este bipartit | ||
+ | *pentru determinarea componentelor conexe dintr-un graf neorientat | ||
+ | *pentru generarea unui arbore de acoperire (**nu** este neaparat unic) | ||
+ | |||
+ | ====== 5. Exercitii ====== | ||
+ | Implementaţi, pentru fiecare cerinţă, câte o funcţie care: | ||
+ | *creează matricea de adiacenţă pentru un graf neorientat cu N noduri, folosindu-se de o listă(sau o matrice cu 2 coloane) de muchii(la alegere - muchiile citite în funcţie sau primite printr-un parametru). | ||
+ | *calculează gradul fiecărui nod. Afişaţi numărul de noduri izolate şi numărul de noduri terminale. | ||
+ | *primeşte un şir de noduri şi verifică dacă acesta poate reprezenta un lanţ. | ||
+ | *primeşte un şir de noduri şi afişează matricea de adiacenţă a subgrafului format cu nodurile respective | ||
+ | **OBS** - Cerintele 2, 3, 4 se vor folosi de matricea de adiacenţă a grafului de la cerinţa 1. | ||