Differences

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

Link to this comparison view

pa:laboratoare:laborator-06 [2026/04/14 01:38]
radu.nichita
pa:laboratoare:laborator-06 [2026/04/14 01:57] (current)
radu.nichita
Line 5: Line 5:
   * Înțelegerea conceptele de graf, reprezentare și parcugere   * Înțelegerea conceptele de graf, reprezentare și parcugere
   * Studierea unor aplicații pentru parcurgeri   * Studierea unor aplicații pentru parcurgeri
- 
  
 ===== Importanţă – aplicaţii practice ===== ===== Importanţă – aplicaţii practice =====
Line 17: Line 16:
   * Modelare grafică (ex. arbori de parționare)   * Modelare grafică (ex. arbori de parționare)
   * Rețele de transport (ex. flux)   * Rețele de transport (ex. flux)
- 
  
 ===== Grafuri ===== ===== Grafuri =====
 Puteți consulta capitolul "​Elementary Graph Algorithms"​ din "​Introduction to Algorithms"​ [0] pentru mai multe definiții formale. Această secțiune sumarizează principalele notații folosite în laboratoarele de PA. Puteți consulta capitolul "​Elementary Graph Algorithms"​ din "​Introduction to Algorithms"​ [0] pentru mai multe definiții formale. Această secțiune sumarizează principalele notații folosite în laboratoarele de PA.
  
- ==== Definiții ====+==== Definiții ====
  
 >> Un **graf** G se definește ca fiind o pereche (V, E), unde **V = {node / un nod oarecare din graf}**, iar **E = {(x, y) / (x, y) muchie in graf}**. >> Un **graf** G se definește ca fiind o pereche (V, E), unde **V = {node / un nod oarecare din graf}**, iar **E = {(x, y) / (x, y) muchie in graf}**.
Line 33: Line 31:
  
 >> Un graf **aciclic** este un graf (orientat/​neorientat) care nu conține cicluri. >> Un graf **aciclic** este un graf (orientat/​neorientat) care nu conține cicluri.
 +
 ==== Reprezentare ==== ==== Reprezentare ====
 Problemele care se modelează folosind grafuri, de obicei, presupun explorarea spațiului. O parcurgere explorează fiecare nod al grafului, exact o singură dată, pornind de la un nod ales, numit în continuare nod sursă (EN: **source**). Modul de reprezentare al grafului poate influența performanța unei parcurgeri/​unui algoritm. Problemele care se modelează folosind grafuri, de obicei, presupun explorarea spațiului. O parcurgere explorează fiecare nod al grafului, exact o singură dată, pornind de la un nod ales, numit în continuare nod sursă (EN: **source**). Modul de reprezentare al grafului poate influența performanța unei parcurgeri/​unui algoritm.
Line 52: Line 51:
       * $adj$   = {$adj[node]$ / unde $adj[node]$ este lista de adiacență a lui node} = reprezentarea grafului ca liste de adiacențe       * $adj$   = {$adj[node]$ / unde $adj[node]$ este lista de adiacență a lui node} = reprezentarea grafului ca liste de adiacențe
         * $adj[node] = {..., neigh, ...}$ => există muchie/arc (node, neigh)         * $adj[node] = {..., neigh, ...}$ => există muchie/arc (node, neigh)
- 
- 
  
 Reprezentarea în memorie a grafurilor se face, de obicei, cu **liste de adiacență**. Se pot folosi însă și alte structuri de date, care vor fi introduse pe parcurs. Reprezentarea în memorie a grafurilor se face, de obicei, cu **liste de adiacență**. Se pot folosi însă și alte structuri de date, care vor fi introduse pe parcurs.
  
 Cele mai uzuale notații din laboratoarele de grafuri sunt descrise în [[https://​ocw.cs.pub.ro/​courses/​pa/​skel_graph | Precizări laboratoare 06-11]] (ex. $n$, $m$, $adj$, $adj\_trans$,​ $(x, y)$, etc). Cele mai uzuale notații din laboratoarele de grafuri sunt descrise în [[https://​ocw.cs.pub.ro/​courses/​pa/​skel_graph | Precizări laboratoare 06-11]] (ex. $n$, $m$, $adj$, $adj\_trans$,​ $(x, y)$, etc).
- 
  
 ==== Colorare ==== ==== Colorare ====
Line 68: Line 64:
  
     * **black** (negru) = nod care a fost complet vizitat (node scos din coadă și pentru care s-a vizitat tot subarborele)     * **black** (negru) = nod care a fost complet vizitat (node scos din coadă și pentru care s-a vizitat tot subarborele)
- 
  
 ==== Algoritmi de parcurgere ==== ==== Algoritmi de parcurgere ====
Line 81: Line 76:
  
 Parcurgerea în lățime **(Breadth-first Search - BFS)** este un algoritm de căutare în graf, în care, atunci când se ajunge într-un nod oarecare **node**, nevizitat, se vizitează toate nodurile nevizitate adiacente lui (notate pe rand cu **neigh**), apoi toate vârfurile nevizitate adiacente vârfurilor adiacente lui node, etc. Parcurgerea în lățime **(Breadth-first Search - BFS)** este un algoritm de căutare în graf, în care, atunci când se ajunge într-un nod oarecare **node**, nevizitat, se vizitează toate nodurile nevizitate adiacente lui (notate pe rand cu **neigh**), apoi toate vârfurile nevizitate adiacente vârfurilor adiacente lui node, etc.
- 
  
 Atenție! BFS depinde de nodul de start **source**. Plecând din acest nod, se vor vizita toate nodurile accesibile. De exemplu, într-un graf neorientat, aceste noduri accesibile formează o componentă conexă; în urma aplicării algoritmului BFS asupra fiecărei componente conexe a grafului, se obține un arbore de acoperire a întregului graf (prin eliminarea muchiilor pe care nu le folosim la parcurgere). Pentru a putea reconstitui acest arbore, se păstrează pentru fiecare nod dat identitatea părintelui său. În cazul în care nu exista o funcție de cost asociată muchiilor, BFS va determina și drumurile minime de la rădăcină la oricare nod. Atenție! BFS depinde de nodul de start **source**. Plecând din acest nod, se vor vizita toate nodurile accesibile. De exemplu, într-un graf neorientat, aceste noduri accesibile formează o componentă conexă; în urma aplicării algoritmului BFS asupra fiecărei componente conexe a grafului, se obține un arbore de acoperire a întregului graf (prin eliminarea muchiilor pe care nu le folosim la parcurgere). Pentru a putea reconstitui acest arbore, se păstrează pentru fiecare nod dat identitatea părintelui său. În cazul în care nu exista o funcție de cost asociată muchiilor, BFS va determina și drumurile minime de la rădăcină la oricare nod.
- 
  
 Pentru implementarea BFS se folosește o coadă. ​ Pentru implementarea BFS se folosește o coadă. ​
- 
  
 ==== Algoritm ==== ==== Algoritm ====
-<code cpp| BFS>+<code cpp>
 // do a BFS traversal from source // do a BFS traversal from source
 // //
Line 140: Line 132:
     }     }
 } }
- 
 </​code>​ </​code>​
  
Line 148: Line 139:
  
 ==== Complexitate ====  ==== Complexitate ==== 
-  *cu liste de adiacență:​ $O(n + m)$ sau $O(|V| + |E|)$ +  * cu liste de adiacență:​ $O(n + m)$ sau $O(|V| + |E|)$ 
-  *cu matrice de adiacență:​ $O(n^2)$ sau  $ O(|V|^2)$+  * cu matrice de adiacență:​ $O(n^2)$ sau  $O(|V|^2)$
  
 ===== DFS - Parcurgerea în adâncime ===== ===== DFS - Parcurgerea în adâncime =====
Line 161: Line 152:
   * $finish[node]$ = timestamp-ul / timpul finalizării   * $finish[node]$ = timestamp-ul / timpul finalizării
   * $p[node]$ = părintele din parcugerea DFS a lui node   * $p[node]$ = părintele din parcugerea DFS a lui node
-  
  
 Spre deosebire de BFS, pentru implementarea DFS se folosește o stivă (abordare **LIFO** în loc de **FIFO**). În practică, stiva nu va fi reținută explicit - ci ne vom baza pe recursivitate. Spre deosebire de BFS, pentru implementarea DFS se folosește o stivă (abordare **LIFO** în loc de **FIFO**). În practică, stiva nu va fi reținută explicit - ci ne vom baza pe recursivitate.
- 
  
 ====  Algoritm ==== ====  Algoritm ====
-<code cpp | DFS>+<code cpp>
 // do a DFS traversal from all nodes // do a DFS traversal from all nodes
 // //
Line 218: Line 207:
  
 ==== Complexitate ==== ==== Complexitate ====
-  *cu liste de adiacență:​ $O(n + m)$ sau $O(|V| + |E|)$ +  * cu liste de adiacență:​ $O(n + m)$ sau $O(|V| + |E|)$ 
-  *cu matrice de adiacență:​ $O(n^2)$ sau  $ O(|V|^2)$ +  * cu matrice de adiacență:​ $O(n^2)$ sau  $O(|V|^2)$
- +
  
 ==== Tipuri de muchii/arce în parcurgerea DFS ==== ==== Tipuri de muchii/arce în parcurgerea DFS ====
Line 240: Line 227:
  
 Pentru **graf orientat**, mai există încă 2 tipuri de muchii (arce): Pentru **graf orientat**, mai există încă 2 tipuri de muchii (arce):
->> **forward-edge** (**F**) / muchie înainte /muchie de înaintare = muchie **(x, y**care nu este **tree-edge** ​ și care conecteză un nod **x** de un descendent **y** . +>> **forward-edge** (**F**) / muchie înainte /muchie de înaintare = muchie **(x, y)** care nu este **tree-edge** și care conecteză un nod **x** de un descendent **y** . 
  
 <​note>​ <​note>​
Line 280: Line 267:
 >> O **sortare topologică** într-un **graf orientat aciclic** reprezintă o aranjare/​permutare a nodurilor din graf care ține cont de arce. >> O **sortare topologică** într-un **graf orientat aciclic** reprezintă o aranjare/​permutare a nodurilor din graf care ține cont de arce.
  
-Orientarea muchiilor corespunde unei relatii de ordine de la nodul sursa catre cel destinație:​ dacă $(x,y$) este un arc, $x$ trebuie să apară înaintea lui $y$ în inșiruire. ​+Orientarea muchiilor corespunde unei relatii de ordine de la nodul sursa catre cel destinație:​ dacă $(x,y)este un arc, $x$ trebuie să apară înaintea lui $y$ în inșiruire. ​
  
 <​note>​ <​note>​
Line 292: Line 279:
     * $n = 5$   $m = 4$      * $n = 5$   $m = 4$ 
     * $arce: { (1,2); (1,3); (2,3); (2,4);} $     * $arce: { (1,2); (1,3); (2,3); (2,4);} $
- 
  
 Toate sortările topologice valide sunt: Toate sortările topologice valide sunt:
Line 313: Line 299:
   * 5 nu depinde de nimeni, poate să apară oriunde   * 5 nu depinde de nimeni, poate să apară oriunde
 </​spoiler>​ </​spoiler>​
 +
 ==== Algoritmi ==== ==== Algoritmi ====
 Sunt doi algoritmi cunoscuti pentru sortarea topologică. Sunt doi algoritmi cunoscuti pentru sortarea topologică.
Line 327: Line 314:
  
 == Complexitate == == Complexitate ==
-    * $T(n) = O(n+ m)$+    * $T(n) = O(n + m)$
  
 === TopSort - BFS: algoritmul lui Kahn === === TopSort - BFS: algoritmul lui Kahn ===
Line 345: Line 332:
  
 == Complexitate == == Complexitate ==
-    * $T(n) = O(n+ m)$ +    * $T(n) = O(n + m)$
  
 ==== Concluzie ==== ==== Concluzie ====
Line 352: Line 338:
     * Algoritmul bazat pe DFS nu verifica daca graful este ciclic: presupune corectitudinea inputului. Este relativ mai simplu de implementat.     * Algoritmul bazat pe DFS nu verifica daca graful este ciclic: presupune corectitudinea inputului. Este relativ mai simplu de implementat.
     * Algoritmul bazat pe BFS se poate folosi pentru a detecta daca graful este aciclic; in caz afirmativ, gaseste o sortare topologica valida. ​     * Algoritmul bazat pe BFS se poate folosi pentru a detecta daca graful este aciclic; in caz afirmativ, gaseste o sortare topologica valida. ​
 +
 ===== TLDR ===== ===== TLDR =====
  
Line 361: Line 348:
  
 ===== Exerciții ===== ===== Exerciții =====
- 
  
 <note warning> <note warning>
Line 371: Line 357:
    * evitați **buguri**    * evitați **buguri**
    * evitați **depunctări** la lab/​teme/​test    * evitați **depunctări** la lab/​teme/​test
- 
 </​note>​ </​note>​
  
Line 382: Line 367:
 </​note>​ </​note>​
  
 +====== Pool probleme (pentru prezentări) ======
  
 +======= 1) Berării 2 =======
  
-=== Task-1: BFS ===+**Enunț:** Se dă un graf orientat reprezentând o rețea de străzi și intersecții ale unui oraș, precum și locațiile în care se află berării. Se cere găsirea tuturor intersecțiilor din care **nu** se poate ajunge la nicio berărie, indiferent de traseul ales, respectând sensul unic al străzilor. 
 + 
 +**Date de intrare:** Numărul de intersecții ''​N'',​ numărul de străzi ''​M'',​ numărul de berării ''​P'',​ urmate de ''​M''​ perechi de noduri (reprezentând străzile orientate) și de ''​P''​ numere reprezentând intersecțiile unde se află berării. 
 + 
 +**Date de ieșire:** Numărul de intersecții din care nu se poate ajunge la o berărie, urmat de lista acestor intersecții,​ afișate în ordine crescătoare. 
 + 
 +Problema se poate testa la: \\ 
 +[[https://​infoarena.ro/​problema/​berarii2|Infoarena - Berării 2]] 
 + 
 +======= 2) Alee ======= 
 + 
 +**Enunț:** O parcare este formată din ''​N × N''​ pătrate de latură 1. Anumite pătrate sunt ocupate de copaci și nu pot fi traversate. Se cere determinarea numărului minim de pași necesari pentru a ajunge de la un pătrat de start la un pătrat de destinație,​ ocolind copacii. Se pot face pași doar pe orizontală și verticală (Nord, Sud, Est, Vest). 
 + 
 +**Date de intrare:** Dimensiunea parcării ''​N'',​ numărul de copaci ''​M'',​ urmate de coordonatele celor ''​M''​ copaci și, la final, coordonatele punctului de plecare și cele ale punctului de sosire. 
 + 
 +**Date de ieșire:** Un singur număr reprezentând distanța minimă (numărul de pași) între cele două poziții. 
 + 
 +Problema se poate testa la: \\ 
 +[[https://​infoarena.ro/​problema/​alee|Infoarena - Alee]] 
 + 
 +======= 3) Muzeu ======= 
 + 
 +**Enunț:** Un muzeu este reprezentat printr-o matrice de ''​N × N''​ zone. În muzeu există spații libere, pereți (obstacole) și mai mulți paznici. Trebuie să determinați,​ pentru fiecare zonă liberă, distanța minimă până la cel mai apropiat paznic, folosind doar deplasări sus/​jos/​stânga/​dreapta. 
 + 
 +**Date de intrare:** Un număr întreg ''​N''​ reprezentând dimensiunea muzeului, urmat de o matrice de ''​N × N''​ caractere, unde ''​P''​ este paznic, ''#''​ este perete, iar ''​.''​ este zonă liberă. 
 + 
 +**Date de ieșire:** O matrice ''​N × N''​ de numere întregi. Celulele conțin 0 dacă acolo este un paznic, ​-1 dacă este un perete, -2 dacă este o zonă în care nu poate ajunge niciun paznic, respectiv distanța minimă pentru zonele libere accesibile. 
 + 
 +Problema se poate testa la\\ 
 +[[https://​infoarena.ro/​problema/​muzeu|Infoarena - Muzeu]] 
 + 
 +======= 4) Course Schedule ======= 
 + 
 +**Enunț:** Se dau ''​N''​ cursuri (numerotate de la 1 la ''​N''​) și ''​M''​ cerințe. Fiecare cerință are forma: "​cursul ''​A''​ trebuie finalizat înainte de a putea începe cursul ''​B''"​. Se cere găsirea unei ordini valide în care un student ar putea să finalizeze toate cele ''​N''​ cursuri respectând aceste condiții. 
 + 
 +**Date de intrare:** Numărul de cursuri ''​N''​ și numărul de cerințe ''​M'',​ urmate de ''​M''​ perechi de numere ''​(A,​ B)''​ reprezentând dependențele. 
 + 
 +**Date de ieșire:** O permutare a celor ''​N''​ cursuri care respectă cerințele date. Dacă este imposibil să se finalizeze toate cursurile, se va afișa textul "​IMPOSSIBLE"​. 
 + 
 +Problema se poate testa la: \\ 
 +[[https://​cses.fi/​problemset/​task/​1679|CSES - Course Schedule]] 
 + 
 +======= 5) Insule ======= 
 + 
 +**Enunț:** O hartă este descrisă de o matrice cu ''​N''​ linii și ''​M''​ coloane. Elementele hărții pot fi 0 (apă) sau 1, 2, 3 (insule aparținând a trei țări diferite). Se cere aflarea numărului de insule din fiecare țară, precum și lungimea minimă a unui pod (format exclusiv din celule cu apă) care să unească o insulă a țării 1 de o insulă a țării 2. 
 + 
 +**Date de intrare:** Dimensiunile hărții ''​N''​ și ''​M'',​ urmate de matricea de caractere formata din ''​0'',​ ''​1'',​ ''​2''​ și ''​3''​. 
 + 
 +**Date de ieșire:** Patru numere: numărul de insule din grupa 1, grupa 2, grupa 3 și lungimea podului minim construit peste apă. 
 + 
 +Problema se poate testa la: \\ 
 +[[https://​infoarena.ro/​problema/​insule|Infoarena - Insule]] 
 + 
 +===== Extra ===== 
 + 
 +==== Exerciții ==== 
 + 
 +<spoiler BFS>
 Se dă un graf **neorientat** cu **n** noduri și **m** muchii. Se mai dă un nod special **source**, pe care îl vom numi sursa. ​ Se dă un graf **neorientat** cu **n** noduri și **m** muchii. Se mai dă un nod special **source**, pe care îl vom numi sursa. ​
  
Line 391: Line 435:
 <note warning> <note warning>
 Restricții și precizări: Restricții și precizări:
-  * $ n, m <= 10^5 $+  * $n, m <= 10^5$
   * timp de execuție   * timp de execuție
     * C++: 1s     * C++: 1s
Line 406: Line 450:
 </​note>​ </​note>​
  
-<​spoiler ​Exemplu 1>+**Exemplu 1:** 
 $n = 5$   $m = 4$  $source = 3$  $n = 5$   $m = 4$  $source = 3$ 
  
 $muchii: { (1,2); (1,3); (2,3); (2,4);} $ $muchii: { (1,2); (1,3); (2,3); (2,4);} $
- 
  
 Răspuns: Răspuns:
Line 425: Line 469:
   * ** d[4] = 2 ** pentru că trebuie să parcurgem 2 muchii ($3-2-4$)   * ** d[4] = 2 ** pentru că trebuie să parcurgem 2 muchii ($3-2-4$)
   * ** d[5] = -1 ** pentru că nu se poate ajunge de la 3 la 5   * ** d[5] = -1 ** pentru că nu se poate ajunge de la 3 la 5
-</​spoiler>​ 
  
 +**Exemplu 2:**
  
-<spoiler Exemplu 2> 
 $n = 7$   $m = 7$  $source = 1$  $n = 7$   $m = 7$  $source = 1$ 
  
Line 446: Line 489:
   * ** d[3] = d[5] = 2 ** pentru că trebuie să parcurgem 2 muchii ($1-2-3$, $1-4-5$)   * ** d[3] = d[5] = 2 ** pentru că trebuie să parcurgem 2 muchii ($1-2-3$, $1-4-5$)
   * ** d[6] = d[7] = 3 ** pentru ca trebuie să parcurgem 3 muchii ($1-2-3-7$ sau $1-4-5-6$)   * ** d[6] = d[7] = 3 ** pentru ca trebuie să parcurgem 3 muchii ($1-2-3-7$ sau $1-4-5-6$)
-</​spoiler>​ 
  
 +**Exemplu 3:**
  
-<spoiler Exemplu 3> 
 $n = 7$   $m = 8$  $source = 1$  $n = 7$   $m = 8$  $source = 1$ 
  
Line 468: Line 510:
 </​spoiler>​ </​spoiler>​
  
- +<​spoiler ​Topological Sort>
-=== Task-2: ​Topological Sort ===+
 Se dă un graf **orientat** aciclic cu **n** noduri și **m** arce. Se cere să se găsească **o sortare topologica** validă. Se dă un graf **orientat** aciclic cu **n** noduri și **m** arce. Se cere să se găsească **o sortare topologica** validă.
  
 <note warning> <note warning>
 Restricții si precizari: Restricții si precizari:
-  * $ n, m <= 10^5 $+  * $n, m <= 10^5$
   * timp de executie   * timp de executie
     * C++: 1s     * C++: 1s
Line 486: Line 527:
 </​note>​ </​note>​
  
-<​spoiler ​Exemplu 1>+**Exemplu 1:** 
 $n = 5$   $m = 4$  $n = 5$   $m = 4$ 
  
 $arce: { (1,2); (1,3); (2,3); (2,4);} $ $arce: { (1,2); (1,3); (2,3); (2,4);} $
- 
  
 Răspuns: $topsort = [1, 2, 3, 4, 5] $ Răspuns: $topsort = [1, 2, 3, 4, 5] $
Line 516: Line 557:
     * $topsort = [5, 1, 2, 4, 3] $     * $topsort = [5, 1, 2, 4, 3] $
  
-</​spoiler>​ +**Exemplu 2:**
  
-<spoiler Exemplu 2> 
 $n = 9$   $m = 8$  $n = 9$   $m = 8$ 
  
Line 532: Line 571:
 (4,8); (4,8);
 } $ } $
- 
  
 Răspuns: $topsort = [1, 2, 3, 4, 6, 7, 8, 5, 9] $ Răspuns: $topsort = [1, 2, 3, 4, 6, 7, 8, 5, 9] $
Line 544: Line 582:
 </​spoiler>​ </​spoiler>​
  
- +<​spoiler ​Max Packet Size>
-=== Task-3: ​Max Packet Size ===+
 Rezolvați problema [[ https://​www.hackerrank.com/​contests/​test-practic-pa-2018-v1-deadbeef/​challenges/​test-1-2-2-max-packet-size-medie/​problem | Max Packet Size ]] pe Hackerrank. Rezolvați problema [[ https://​www.hackerrank.com/​contests/​test-practic-pa-2018-v1-deadbeef/​challenges/​test-1-2-2-max-packet-size-medie/​problem | Max Packet Size ]] pe Hackerrank.
- 
-=== Task-4: Berării 2=== 
-Rezolvați problema [[https://​infoarena.ro/​problema/​berarii2 | Berării 2 ]] pe Infoarena. ​ 
- 
-=== BONUS === 
-**B1** Determinați componentele conexe ale unui graf neorientat. Puteți testa implementarea pe infoarena la problema [[https://​infoarena.ro/​problema/​dfs| dfs]]. 
- 
-**B2** Rezolvați problema [[https://​infoarena.ro/​problema/​muzeu| muzeu]] pe infoarena. 
- 
-=== Extra === 
- 
-<spoiler arbore3> 
-Rezolvați problema [[https://​infoarena.ro/​problema/​arbore3 
-| arbore3]] pe infoarena. ​ 
 </​spoiler>​ </​spoiler>​
  
-<​spoiler ​Pokemon GO AWAY+<​spoiler ​Labyrinth (CSES)
-Rezolvați problema [[https://www.hackerrank.com/​contests/​test-practic-pa-2017-v2-meeseeks/​challenges/​test-2-pokemon-go-away-grea| Pokemon GO AWAY]] ​de la test PA 2017.+**Enunț:** Se dă o hartă a unui labirint sub forma unei matriceSe cere să se găsească un drum de lungime minimă ​de la o celulă de start '​A'​ la o celulă de destinație '​B'​. Afișați lungimea drumului minim și o secvență de mutări (L, R, U, D) care descrie pașii.
  
-Cu ce problemă seamana?+Problema se poate testa la: \\ 
 +[[https://​cses.fi/​problemset/​task/​1193 | CSES - Labyrinth]]
 </​spoiler>​ </​spoiler>​
  
-<​spoiler ​insule+<​spoiler ​Building Roads (CSES)
-Rezolvați problema [[https://infoarena.ro/​problema/​insule +**Enunț:** Se dă o rețea de ''​N''​ orașe și ''​M''​ drumuri bidirecționale existenteSe cere determinarea numărului minim de drumuri noi ce trebuie construite astfel încât să se poată ajunge din orice oraș în oricare altul din rețea
-| insule]] pe infoarena. +
-</​spoiler>​+
  
-<spoiler tsunami>​ +**Hint:** Problema se reduce la aflarea numărului de componente conexe.
-Rezolvați problema [[https://infoarena.ro/​problema/​tsunami +
-| tsunami]] pe infoarena. +
-</​spoiler>​+
  
- +Problema se poate testa la: \\ 
-<spoiler berarii2>​ +[[https://cses.fi/problemset/task/​1666 ​CSES - Building Roads]]
-Rezolvați problema ​[[https://infoarena.ro/problema/berarii2 +
-berarii2]] pe infoarena.+
 </​spoiler>​ </​spoiler>​
  
- +<spoiler Componente Conexe> 
-====== Pool probleme (pentru prezentări) ====== +**Enunț:** Se dă un graf neorientat cu ''​N''​ noduri și ''​M'' ​muchii. Se cere să se determine numărul de componente conexe ​din graf. O componentă conexă este un subgraf maximal ​în care există drum între oricare două noduri.
- +
-======= 1) Berării 2 ======= +
- +
-**Enunț:** Se dă un graf orientat reprezentând o rețea de străzi și intersecții ale unui oraș, precum și locațiile în care se află berării. Se cere găsirea tuturor intersecțiilor din care **nu** se poate ajunge la nicio berărie, indiferent de traseul ales, respectând sensul unic al străzilor. +
- +
-**Date de intrare:** Numărul de intersecții ​''​N''​, numărul de străzi ''​M'',​ numărul de berării ''​P'',​ urmate de ''​M''​ perechi de noduri ​(reprezentând străzile orientate) ​și de ''​P'' ​numere reprezentând intersecțiile unde se află berării. +
- +
-**Date de ieșire:** Numărul de intersecții ​din care nu se poate ajunge la o berărie, urmat de lista acestor intersecții,​ afișate ​în ordine crescătoare.+
  
 Problema se poate testa la: \\ Problema se poate testa la: \\
-[[https://​infoarena.ro/​problema/​berarii2|Infoarena - Berării 2]]+[[https://​infoarena.ro/​problema/​dfs | Infoarena - DFS]] 
 +</​spoiler>​
  
-======= 2) Alee ======= +<spoiler Sortare Topologică>​ 
- +**Enunț:​** ​Se dă un graf orientat aciclic (DAG) cu ''​N'' ​noduri ​și ''​M''​ arceSă se determine o sortare topologică a nodurilor saleAranjamentul trebuie să garanteze că pentru orice arc de la ''​X'' ​la ''​Y'', ​nodul ''​X'' ​apare înaintea nodului ​''​Y''​ în secvența finală. 
-**Enunț:​** ​O parcare este formată din ''​N × N'' ​pătrate de latură 1. Anumite pătrate sunt ocupate de copaci ​și nu pot fi traversateSe cere determinarea numărului minim de pași necesari pentru ​ajunge de la un pătrat de start la un pătrat de destinație,​ ocolind copaciiSe pot face pași doar pe orizontală și verticală (Nord, Sud, Est, Vest). +
- +
-**Date ​de intrare:** Dimensiunea parcării ​''​N''​, numărul de copaci ​''​M'', ​urmate de coordonatele celor ''​M'' ​copaci și, la final, coordonatele punctului de plecare și cele ale punctului de sosire. +
- +
-**Date de ieșire:** Un singur număr reprezentând distanța minimă (numărul de pași) între cele două poziții.+
  
 Problema se poate testa la: \\ Problema se poate testa la: \\
-[[https://​infoarena.ro/​problema/​alee|Infoarena - Alee]]+[[https://​infoarena.ro/​problema/​sortaret ​| Infoarena - Sortare Topologică]] 
 +</​spoiler>​
  
-======= 3) Muzeu =======+<spoiler Arbore3>​ 
 +Rezolvați problema [[https://​infoarena.ro/​problema/​arbore3 | arbore3]] pe Infoarena. 
 +</​spoiler>​
  
-**Enunț:** Un muzeu este reprezentat printr-o matrice de ''​N × N''​ zoneÎn muzeu există spații libere, pereți (obstacole) și mai mulți pazniciTrebuie să determinați,​ pentru fiecare zonă liberă, distanța minimă până la cel mai apropiat paznic, folosind doar deplasări sus/jos/stânga/dreapta.+<spoiler Pokemon GO AWAY> 
 +Rezolvați problema [[https://www.hackerrank.com/contests/test-practic-pa-2017-v2-meeseeks/challenges/​test-2-pokemon-go-away-grea | Pokemon GO AWAY]] de la Testul Practic PA 2017.
  
-**Date de intrare:** Un număr întreg ''​N''​ reprezentând dimensiunea muzeului, urmat de o matrice de ''​N × N''​ caractere, unde ''​P''​ este paznic, ''#''​ este perete, iar ''​.''​ este zonă liberă. +**Hint:** Cu ce problemă seamănă? 
- +</spoiler>
-**Date de ieșire:** O matrice ''​N × N''​ de numere întregi. Celulele conțin 0 dacă acolo este un paznic, -1 dacă este un perete, -2 dacă este o zonă în care nu poate ajunge niciun paznic, respectiv distanța minimă pentru zonele libere accesibile. +
- +
-Problema se poate testa la: \\ +
-[[https://​infoarena.ro/​problema/​muzeu|Infoarena - Muzeu]] +
- +
-======= 4) Course Schedule ======= +
- +
-**Enunț:** Se dau ''​N''​ cursuri (numerotate de la 1 la ''​N''​) și ''​M''​ cerințe. Fiecare cerință are forma: "​cursul ''​A''​ trebuie finalizat înainte de a putea începe cursul ''​B''"​. Se cere găsirea unei ordini valide în care un student ar putea să finalizeze toate cele ''​N''​ cursuri respectând aceste condiții. +
- +
-**Date de intrare:** Numărul de cursuri ''​N''​ și numărul de cerințe ''​M'',​ urmate de ''​M''​ perechi de numere ''​(A,​ B)''​ reprezentând dependențele. +
- +
-**Date de ieșire:** O permutare a celor ''​N''​ cursuri care respectă cerințele date. Dacă este imposibil să se finalizeze toate cursurile, se va afișa textul "​IMPOSSIBLE"​. +
- +
-Problema se poate testa la: \\ +
-[[https://​cses.fi/​problemset/​task/​1679|CSES - Course Schedule]] +
- +
-======= 5) Insule ======= +
- +
-**Enunț:** O hartă este descrisă de o matrice cu ''​N''​ linii și ''​M''​ coloane. Elementele hărții pot fi 0 (apă) sau 1, 2, 3 (insule aparținând a trei țări diferite). Se cere aflarea numărului de insule din fiecare țară, precum și lungimea minimă a unui pod (format exclusiv din celule cu apă) care să unească o insulă a țării 1 de o insulă a țării 2. +
- +
-**Date de intrare:** Dimensiunile hărții ''​N''​ și ''​M'',​ urmate de matricea de caractere formata din ''​0'',​ ''​1'',​ ''​2''​ și ''​3''​. +
- +
-**Date de ieșire:** Patru numere: numărul de insule din grupa 1, grupa 2, grupa 3 și lungimea podului minim construit peste apă. +
- +
-Problema se poate testa la: \\ +
-[[https://​infoarena.ro/​problema/insule|Infoarena - Insule]]+
  
 +<spoiler Tsunami>
 +Rezolvați problema [[https://​infoarena.ro/​problema/​tsunami | tsunami]] pe Infoarena.
 +</​spoiler>​
  
 ===== Referințe ===== ===== Referințe =====
Line 653: Line 639:
  
 [3] [[https://​en.wikipedia.org/​wiki/​Topological_sorting]] [3] [[https://​en.wikipedia.org/​wiki/​Topological_sorting]]
- 
pa/laboratoare/laborator-06.txt · Last modified: 2026/04/14 01:57 by radu.nichita
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