This shows you the differences between two versions of the page.
sd-ca:laboratoare:laborator-08 [2015/04/19 22:43] cosmin_ioan.petrisor [Aplicaţii] |
sd-ca:laboratoare:laborator-08 [2015/05/09 22:42] (current) cosmin_ioan.petrisor [Obiective] |
||
---|---|---|---|
Line 4: | Line 4: | ||
* [[petrisor_cosmin_ioan@yahoo.com|Cosmin Petrişor]] | * [[petrisor_cosmin_ioan@yahoo.com|Cosmin Petrişor]] | ||
===== Obiective ===== | ===== Obiective ===== | ||
- | În urma parcurgerii acestui laborator, studentul va fi capabil: | + | În urma parcurgerii acestui laborator, studentul va fi capabil să: |
- | * să înțeleagă operațiile de parcurgere a grafurilor și diferențele dintre ele. | + | * înțeleagă operațiile de parcurgere a grafurilor și diferențele dintre ele. |
- | * să implementeze parcurgerile pe grafuri având la dispoziție structurile de date studiate. | + | * implementeze parcurgerile pe grafuri având la dispoziție structurile de date studiate. |
- | * să evalueze complexitatea parcurgerii grafurilor. | + | * evalueze complexitatea parcurgerii grafurilor. |
- | * să găsească soluțiile unor probleme folosind algoritmii de parcurgere | + | * găsească soluțiile unor probleme folosind algoritmii de parcurgere |
===== Ce este un graf ===== | ===== Ce este un graf ===== | ||
Line 147: | Line 147: | ||
Un exemplu de aplicare al DFS este următorul: | Un exemplu de aplicare al DFS este următorul: | ||
+ | |||
{{sd-ca:laboratoare:df1.jpg}} | {{sd-ca:laboratoare:df1.jpg}} | ||
Line 152: | Line 153: | ||
Arborele obținut în urma parcurgerii este următorul: | Arborele obținut în urma parcurgerii este următorul: | ||
+ | |||
{{sd-ca:laboratoare:df2.jpg}} | {{sd-ca:laboratoare:df2.jpg}} | ||
Line 164: | Line 166: | ||
tFin[u] = 0 | tFin[u] = 0 | ||
} | } | ||
- | |||
contor_timp = 0 | contor_timp = 0 | ||
- | + | ||
- | + | // funcţie de vizitare a nodului | |
- | vizitare(nod) // funcţie de vizitare a nodului | + | vizitare(nod) |
{ | { | ||
contor_timp = contor_timp + 1 | contor_timp = contor_timp + 1 | ||
Line 294: | Line 295: | ||
std::copy(v.begin(), v.end(), out_it); | std::copy(v.begin(), v.end(), out_it); | ||
</code> | </code> | ||
- | |||
- | |||
- | 2.**[4p]** Se numește graf bipartit un graf ''G = (V, E)'' în care mulțimea nodurilor poate fi împărțită în două mulțimi disjuncte ''A'' și ''B'' astfel încât ''V = A U B'' şi ''E este inclus în A x B'' (orice muchie leagă un nod din ''A'' cu un nod din ''B''). | ||
- | |||
- | {{sd-ca:laboratoare:bipartit.jpg}} | ||
- | |||
- | Folosind codul de la problema 1, determinaţi dacă un graf este bipartit. | ||
- | |||
- | * Pentru a determina dacă un graf este bipartit sau nu, una din metode constă în efectuarea de parcurgeri ''BFS'' și atribuirea de etichete nodurilor conform cu paritatea nivelului acestora în parcurgere (''A'' pentru nodurile de pe nivel par, ''B'' pentru nodurile de pe nivel impar). Atunci când se adaugă vecinii nevizitați ai unui nod în coadă, se vor verifica de asemenea etichetele vecinilor deja vizitați: dacă se descoperă că unul din aceștia are aceeași etichetă ca cea atribuită nodului curent, graful are o muchie între noduri de pe același nivel și deci nu poate fi bipartit. În caz contrar (s-a realizat parcurgerea ''BFS'' fără a apărea această situație), graful este bipartit și nodurile sunt etichetate cu mulțimea din care fac parte. | ||
- | * În scheletul de cod, secţiunea aferentă acestei probleme este marcată cu **TODO2.1**. | ||
<hidden> | <hidden> | ||
- | 3. **[4p]** Considerăm ca fişierul de intrare al primei probleme, reprezintă ''N'' cursuri ale unei programe analitice, între care există ''M'' condiționări de forma ''A-B'', cu semnificația ''cursul A trebuie să preceadă cursul B''. În acest caz graful este //orientat//. Fiind date regulile de precendență (aflate în fișierul ''graf.in''), propuneți o ordonare coerentă de studiere a materiilor. | + | 2.**[4p]** Se dă un labirint, specificat prin intermediul unei matrice ''M x N''. Unele dintre celulele acestei matrice sunt libere (se poate trece), în timp ce altele conțin câte un # (reprezentând un obstacol). Labirintul este complet închis (nu există intrări și ieșiri). Într-o poziţie a labirintului există un roboțel, care se poate mișca într-una din cele patru direcții: stânga, dreapta, sus, jos (nu poate merge pe diagonală). Afişaţi **distanţele minime** de la poziţia iniţială a robotului la restul celulelor. Datele se vor citi dintr-un fișier cu următorul format. |
- | * Structura codului ce trebuie implementată este marcată cu secțiunea **TODO3.1**. | + | |
- | * Cursul 0 reprezintă **singurul** curs de bază, fără de care nici un alt curs nu se poate desfășura. | + | |
- | + | ||
- | + | ||
- | 4.**[4p]** Se dă un labirint, specificat prin intermediul unei matrice ''M x N''. Unele dintre celulele acestei matrice sunt libere (se poate trece), în timp ce altele conțin câte un # (reprezentând un obstacol). Labirintul este complet închis (nu există intrări și ieșiri). Într-o poziţie a labirintului există un roboțel, care se poate mișca într-una din cele patru direcții: stânga, dreapta, sus, jos (nu poate merge pe diagonală). Afişaţi **distanţele minime** de la poziţia iniţială a robotului la restul celulelor. Datele se vor citi dintr-un fișier cu următorul format. | + | |
* pe prima linie: numărul de linii ''M'' și de coloane ''N'' din labirint | * pe prima linie: numărul de linii ''M'' și de coloane ''N'' din labirint | ||
* pe următoarele ''M'' linii: câte ''N'' caractere reprezentând conținutul celulei: '.' pentru spațiu liber, '#' pentru perete | * pe următoarele ''M'' linii: câte ''N'' caractere reprezentând conținutul celulei: '.' pentru spațiu liber, '#' pentru perete | ||
Line 343: | Line 329: | ||
* pereche.second - accesează al doilea element al perechii | * pereche.second - accesează al doilea element al perechii | ||
+ | 3. **[4p]** Considerăm ca fişierul de intrare al primei probleme, reprezintă ''N'' cursuri ale unei programe analitice, între care există ''M'' condiționări de forma ''A-B'', cu semnificația ''cursul A trebuie să preceadă cursul B''. În acest caz graful este //orientat//. Fiind date regulile de precendență (aflate în fișierul ''graf.in''), propuneți o ordonare coerentă de studiere a materiilor. | ||
+ | * Structura codului ce trebuie implementată este marcată cu secțiunea **TODO3.1**. | ||
+ | * Cursul 0 reprezintă **singurul** curs de bază, fără de care nici un alt curs nu se poate desfășura. | ||
+ | |||
+ | 4.**[4p]** Se numește graf bipartit un graf ''G = (V, E)'' în care mulțimea nodurilor poate fi împărțită în două mulțimi disjuncte ''A'' și ''B'' astfel încât ''V = A U B'' şi ''E este inclus în A x B'' (orice muchie leagă un nod din ''A'' cu un nod din ''B''). | ||
+ | |||
+ | {{sd-ca:laboratoare:bipartit.jpg}} | ||
+ | |||
+ | Folosind codul de la problema 1, determinaţi dacă un graf este bipartit. | ||
+ | |||
+ | * Pentru a determina dacă un graf este bipartit sau nu, una din metode constă în efectuarea de parcurgeri ''BFS'' și atribuirea de etichete nodurilor conform cu paritatea nivelului acestora în parcurgere (''A'' pentru nodurile de pe nivel par, ''B'' pentru nodurile de pe nivel impar). Atunci când se adaugă vecinii nevizitați ai unui nod în coadă, se vor verifica de asemenea etichetele vecinilor deja vizitați: dacă se descoperă că unul din aceștia are aceeași etichetă ca cea atribuită nodului curent, graful are o muchie între noduri de pe același nivel și deci nu poate fi bipartit. În caz contrar (s-a realizat parcurgerea ''BFS'' fără a apărea această situație), graful este bipartit și nodurile sunt etichetate cu mulțimea din care fac parte. | ||
+ | * În scheletul de cod, secţiunea aferentă acestei probleme este marcată cu **TODO2.1**. | ||
</hidden> | </hidden> | ||
===== Interviu ===== | ===== Interviu ===== |