Differences

This shows you the differences between two versions of the page.

Link to this comparison view

sd-ca:laboratoare:laborator-08 [2015/04/19 22:40]
cosmin_ioan.petrisor [Resurse]
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ă î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 255: Line 256:
  
 1.**[7p]** Se citesc din fişierul ''​graf.in''​ M muchii ale unui graf //​neorientat//​ cu N vârfuri. Folosind scheletul de cod dat implementaţi următoarele cerinţe: 1.**[7p]** Se citesc din fişierul ''​graf.in''​ M muchii ale unui graf //​neorientat//​ cu N vârfuri. Folosind scheletul de cod dat implementaţi următoarele cerinţe:
-  * TODO1.1: Studiati reprezentarea grafului în scheletul de cod ataşat. +  ​* **TODO1.1**: Studiati reprezentarea grafului în scheletul de cod ataşat. 
-  * TODO1.2: (1p) Adăugaţi muchiile în structura grafului. În scheletul de cod graful este reprezentat ca un vector de liste de adiacenţă. +  ​* **TODO1.2**: (1p) Adăugaţi muchiile în structura grafului. În scheletul de cod graful este reprezentat ca un vector de liste de adiacenţă. 
-  * TODO1.3: (3p) Implementaţi parcurgerea BFS a grafului pornind dintr-un nod ales. +  ​* **TODO1.3**: (3p) Implementaţi parcurgerea BFS a grafului pornind dintr-un nod ales. 
-  * TODO1.4: (3p) Implementaţi parcurgerea DFS a grafului pornind dintr-un nod ales.+  ​* **TODO1.4**: (3p) Implementaţi parcurgerea DFS a grafului pornind dintr-un nod ales.
   ​   ​
   * Datele se vor citi dintr-un fișier cu următorul format:   * Datele se vor citi dintr-un fișier cu următorul format:
Line 272: Line 273:
     * Un vector se poate sorta cu ajutorul funcției [[http://​www.cplusplus.com/​reference/​algorithm/​sort/​|sort]] din STL.     * Un vector se poate sorta cu ajutorul funcției [[http://​www.cplusplus.com/​reference/​algorithm/​sort/​|sort]] din STL.
     * Exemplu de sortare: ''​std::​sort(v.begin(),​v.end());''​     * Exemplu de sortare: ''​std::​sort(v.begin(),​v.end());''​
-    ​* Exemplu de parcurgere și afișare a elementelor dintr-un vector STL folosind indecsi:+  ​* Exemplu de parcurgere și afișare a elementelor dintr-un vector STL folosind indecsi:
  
 <code c++> <code c++>
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 =====
sd-ca/laboratoare/laborator-08.1429472405.txt.gz · Last modified: 2015/04/19 22:40 by cosmin_ioan.petrisor
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0