This shows you the differences between two versions of the page.
|
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 matrice. Se 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 existente. Se 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'' arce. Să se determine o sortare topologică a nodurilor sale. Aranjamentul 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 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: \\ | 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 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. | + | <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]] | ||
| - | |||