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:10]
cosmin_ioan.petrisor [Sortarea topologică]
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 254: Line 255:
 Porniți exercițiile de la **{{sd-ca:​laboratoare:​lab07-tasks.zip | scheletul de cod}}** oferit. Porniți exercițiile de la **{{sd-ca:​laboratoare:​lab07-tasks.zip | scheletul de cod}}** oferit.
  
-1. Se citesc din fisierul ​''​graf.in''​ M muchii ale unui graf //​neorientat//​ cu N varfuri. Folosind scheletul de cod dat implementati urmatoarele cerinte+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 ​in scheletul de cod atasat+  ​* **TODO1.1**: Studiati reprezentarea grafului ​în scheletul de cod ataşat
-  * TODO1.2: (1p) Adaugati ​muchiile ​in structura grafului. ​In scheletul de cod graful este reprezentat ca un vector de liste de adiacenta+  ​* **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) Implementati ​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) Implementati ​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. +  ​ 
-  * pe prima linie: numărul de varfuri ''​N''​ și de muchii ''​M''​ ale grafului +  * Datele se vor citi dintr-un fișier cu următorul format: 
-  * pe următoarea linie: nodul de start BFS si nodul de start DFS +      * pe prima linie: numărul de varfuri ''​N''​ și de muchii ''​M''​ ale grafului 
-  * pe următoarele ''​M''​ linii: perechi de noduri (u,v) pentru care exista ​muchii ​in graf+      * pe următoarea linie: nodul de start BFS si nodul de start DFS 
 +      * pe următoarele ''​M''​ linii: perechi de noduri (u,v) pentru care există ​muchii ​în graf
  
  
Line 271: 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++>
-    for (int i = 0; i < v.size(); ​++) +    for (unsigned ​int i = 0; i < v.size(); ++i
     {     {
         std::cout << v[i] << std::endl;         std::cout << v[i] << std::endl;
Line 282: Line 284:
  
 <code c++> <code c++>
-    for (std::​vector<​int>::​iterator it=v.begin();​it!=v.end();​it++) +    for (std::​vector<​int>::​iterator it = v.begin(); it != v.end(); ++it
     {     {
         std::cout << *it << std::endl;         std::cout << *it << std::endl;
Line 290: Line 292:
  
 <code c++> <code c++>
-   ​std::​ostream_iterator<​int>​ out_it(std::​cout,​std::​endl);​ +   ​std::​ostream_iterator<​int>​ out_it(std::​cout,​ std::​endl);​ 
-   ​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. 
-  * In scheletul de cod, sectiunea aferenta acestei probleme este marcata cu TODO2.1 
- 
- 
-3. **[4p]** Consideram ca fisierul de intrare al primei probleme, reprezinta ''​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''​. (In 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 
-  * Se consideră că cursul 0 reprezintă **singurul** curs de bază, fără de care nici un alt curs nu se poate desfășura. 
  
 <​hidden>​ <​hidden>​
-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.+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.
   * 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 334: Line 321:
   * [[http://​www.cplusplus.com/​reference/​stl/​queue/​ | Queue]] pentru care aveţi nevoie de următoarele funcţii:   * [[http://​www.cplusplus.com/​reference/​stl/​queue/​ | Queue]] pentru care aveţi nevoie de următoarele funcţii:
     * q.empty() - testează dacă coada este vidă     * q.empty() - testează dacă coada este vidă
-    * q.push(e) - adaugă elementul ​în stivă+    * q.push(e) - adaugă elementul în coadă
     * q.front() - accesează elementul din capul cozii     * q.front() - accesează elementul din capul cozii
     * q.pop() - extrage elementul din capul cozii (fără a-l returna)     * q.pop() - extrage elementul din capul cozii (fără a-l returna)
Line 342: 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 =====
 Această secțiune nu este punctată și încearcă să vă facă o oarecare idee a tipurilor de întrebări pe care le puteți întâlni la un job interview (internship,​ part-time, full-time, etc.) din materia prezentată în cadrul laboratorului. Această secțiune nu este punctată și încearcă să vă facă o oarecare idee a tipurilor de întrebări pe care le puteți întâlni la un job interview (internship,​ part-time, full-time, etc.) din materia prezentată în cadrul laboratorului.
  
-Cum multe din companiile mari folosesc date stocate sub forma de grafuri (Facebook Open Graph, Google Social Graph si Page Rank etc) la angajare vor dori sa vada ca stiti grafuri: ​+Cum multe din companiile mari folosesc date stocate sub formă ​de grafuri (Facebook Open Graph, Google Social Graph şi Page Ranketc.) la angajare vor dori să vadă ca ştiţi ​grafuri: ​
  
-  * cum se reprezeinta ​grafurile +  * cum se reprezintă ​grafurile 
-  * cum functioneaza si cum se implementeaza ​parcurgerile (BFS, DFS) +  * cum funcţionează şi cum se implementează ​parcurgerile (BFS, DFS) 
-  * algoritmi mai avansati ​pentru grafuri precum Dijkstra ​si A* (cu care va veti familiariza la materiile de algoritmica ​din anul 2: Analiza Algoritmilor si Proiectarea Algoritmilor)+  * algoritmi mai avansaţi ​pentru grafuri precum Dijkstra ​şi A* (cu care vă veţi familiariza la materiile de algoritmică ​din anul 2: Analiza Algoritmilor si Proiectarea Algoritmilor)
  
-Puteti cauta mai multe intrebari ​pe http://​www.careercup.com/ ​si pe http://​www.glassdoor.com/​+Puteţi căuta ​mai multe întrebări ​pe http://​www.careercup.com/ ​şi pe http://​www.glassdoor.com/​
 ===== Resurse ===== ===== Resurse =====
  
Line 365: Line 364:
 [5] - [[http://​en.wikipedia.org/​wiki/​Dijkstra%27s_algorithm | Dijkstra ]] [5] - [[http://​en.wikipedia.org/​wiki/​Dijkstra%27s_algorithm | Dijkstra ]]
  
-[6] - [[http://​en.wikipedia.org/​wiki/​Bellman-ford | Bellman - Ford ]]+[6] - [[http://​en.wikipedia.org/​wiki/​Bellman-ford | Bellman-Ford ​]] 
 + 
 +[7] - [[http://​en.wikipedia.org/​wiki/​Floyd%E2%80%93Warshall_algorithm | Floyd-Warshall ]] 
 + 
 +[8] - [[http://​en.wikipedia.org/​wiki/​A*_search_algorithm | A* ]]
sd-ca/laboratoare/laborator-08.1429470658.txt.gz · Last modified: 2015/04/19 22:10 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