This shows you the differences between two versions of the page.
|
pa:laboratoare:laborator-09 [2025/04/27 18:51] darius.neatu [Task-2: Johnson] |
pa:laboratoare:laborator-09 [2026/05/11 02:05] (current) radu.nichita [Exerciții] |
||
|---|---|---|---|
| Line 1: | Line 1: | ||
| ====== Laborator 09: Drumuri minime în grafuri: surse / destinații multiple. (2/2) ====== | ====== Laborator 09: Drumuri minime în grafuri: surse / destinații multiple. (2/2) ====== | ||
| + | {{:pa:new_pa:partners:adobe-logo.png?250 |}} | ||
| + | Adobe is a global technology leader with a mission to **change the world through personalized digital experiences**. For over four decades, Adobe has transformed how individuals, teams, businesses, and enterprises create, manage, and deliver content across every surface and channel. | ||
| - | {{:pa:new_pa:partners:adobe-logo.png?155 |}} | + | With **AI at the core**, tools like **Adobe Firefly** and AI-powered assistants make creativity faster, smarter, and more personalized—while keeping it safe and responsible. In **Adobe Experience Cloud**, AI powers real-time personalization, predictive insights, and automated customer journeys, helping brands deliver exceptional experiences at scale. At Adobe, **creativity meets productivity**, and AI is the catalyst for transformation. |
| - | \\ \\ \\ Changing the world through digital experiences is what Adobe’s all about. We give everyone - from emerging artists to global brands - everything they need to design and deliver exceptional digital experiences! We’re passionate about empowering people to create beautiful and powerful images, videos, and apps, and transform how companies interact with customers across every screen. | + | |
| ===== Obiective laborator ===== | ===== Obiective laborator ===== | ||
| Line 199: | Line 200: | ||
| Johnson(G=(nodes, adj)) { | Johnson(G=(nodes, adj)) { | ||
| // STEP 1: Compute adjustment distances h (using Bellmand-Ford). | // STEP 1: Compute adjustment distances h (using Bellmand-Ford). | ||
| - | has_cycle, h = ComputerH(G); | + | has_cycle, h = ComputeH(G); |
| if (has_cycle) { | if (has_cycle) { | ||
| return true, null, null; | return true, null, null; | ||
| Line 416: | Line 417: | ||
| * **graf rar**: aplicăm Johnson și obținem $O(n * m * log (n))$. | * **graf rar**: aplicăm Johnson și obținem $O(n * m * log (n))$. | ||
| - | ===== Exerciții ===== | + | ===== Implementarea algoritmilor standard ===== |
| <note> | <note> | ||
| + | [[https://github.com/acs-pa/pa-lab/tree/main/algorithms/lab09|pa-lab/algorithms/lab09]] conține implementarea algoritmilor standard / tehnicilor / tiparelor de algoritmi pentru acest laborator. | ||
| + | </note> | ||
| - | Scheletul de laborator se găsește pe pagina [[https://github.com/acs-pa/pa-lab/tree/main/skel/lab10|pa-lab::skel/lab10]]. | ||
| - | </note> | ||
| <note warning> | <note warning> | ||
| Line 437: | Line 437: | ||
| </note> | </note> | ||
| - | ==== Task-1: Roy-Floyd ==== | + | ====== Pool probleme (pentru prezentări) ====== |
| - | Se dă un graf **orientat** cu **n** noduri. Graful are **costuri strict pozitive**. | + | ======= 1) Number of Possible Sets of Closing Branches ======= |
| - | Se dă matricea ponderilor - **w**, se cere matricea drumurilor minime - **d**, aplicând algoritmul **Roy-Floyd**. | + | Enunț: O companie are ''N'' sucursale și mai multe drumuri bidirecționale, fiecare având o anumită distanță. O configurație a sucursalelor care rămân deschise este considerată validă dacă distanța minimă dintre oricare două sucursale deschise nu depășește o limită dată. Sarcina este să găsești numărul total de configurații valide (inclusiv configurația în care toate sucursalele sunt închise). |
| + | Date de intrare: Un număr întreg ''N'' reprezentând numărul de sucursale, un număr întreg ''maxDistance'' reprezentând distanța maximă permisă și o matrice ''roads'', unde fiecare element este un triplet ''[u, v, weight]'' ce reprezintă un drum bidirecțional și lungimea acestuia. | ||
| - | <note warning> | + | Date de ieșire: Un singur număr întreg reprezentând numărul total de configurații valide de sucursale. |
| - | Restricții și precizări: | + | Problema se poate testa la: |
| + | [[https://leetcode.com/problems/number-of-possible-sets-of-closing-branches/description/|LeetCode - Number of Possible Sets of Closing Branches]] | ||
| - | * $ n <= 100 $ | + | ======= 2) Minimum Cost to Convert String I ======= |
| - | * $ 0 <= c <= 1.000$, unde c este costul unui arc. | + | |
| - | * Dacă **nu există arc** între o pereche de noduri x și y, distanța de la nodul x la nodul y din **matricea ponderilor** va fi 0. | + | |
| - | * Dacă după aplicarea algoritmului **nu se găsește drum** pentru o pereche de noduri x și y, se va considera **distanța** dintre ele egală cu 0 (se stochează în **matricea distantelor** valoarea 0). | + | |
| - | * Drumul de la nodul i la nodul i are lungime 0 (prin convenție). | + | |
| - | * timp de execuție | + | |
| - | * C++: 1s | + | |
| - | * Java: 8s | + | |
| + | Enunț: Se dau două șiruri de caractere, ''source'' și ''target'', de aceeași lungime, formate exclusiv din litere mici ale alfabetului englez, și trei vectori: ''original'', ''changed'' și ''cost''. O literă din ''original'' se poate transforma în litera corespunzătoare din ''changed'' plătind costul asociat din ''cost''. Se cere găsirea costului minim total pentru a transforma șirul ''source'' în șirul ''target'', știind că operațiile de transformare pot fi aplicate în lanț de oricâte ori. | ||
| - | </note> | + | Date de intrare: Șirurile de caractere ''source'' și ''target'', împreună cu vectorii de transformare ''original'', ''changed'' și ''cost''. |
| - | ==== Task-2: Johnson ==== | + | Date de ieșire: Un singur număr întreg reprezentând costul minim pentru transformarea întregului șir, sau -1 dacă transformarea este imposibilă. |
| - | Se dă un graf **orientat** cu **n** noduri. Graful are **costuri oarecare** (pot fi și negative). | + | Problema se poate testa la: |
| + | [[https://leetcode.com/problems/minimum-cost-to-convert-string-i/|LeetCode - Minimum Cost to Convert String I]] | ||
| - | Se dă lista de adiacență cu costurile aferente, se cere matricea drumurilor minime - **d**, aplicând algoritmul **Johnson**. | + | ======= 3) Roy-Floyd Invers (rfinv) ======= |
| - | + | ||
| - | + | ||
| - | <note warning> | + | |
| - | + | ||
| - | Restricții și precizări: | + | |
| - | + | ||
| - | * $ n <= 1000 $ | + | |
| - | * $ m <= 25000 $ | + | |
| - | * $ -1000 <= c <= 1.000$, unde c este costul unui arc. | + | |
| - | * Dacă **nu există arc** între o pereche de noduri x și y, distanța de la nodul x la nodul y din **matricea ponderilor** va fi 0. | + | |
| - | * Dacă după aplicarea algoritmului **nu se găsește drum** pentru o pereche de noduri x și y, se va considera **distanța** dintre ele egală cu 0 (se stochează în **matricea distantelor** valoarea 0). | + | |
| - | * Drumul de la nodul i la nodul i are lungime 0 (prin convenție). | + | |
| - | * Dacă graful conține un ciclu de cost negativ, se va afișa mesajul: Ciclu negativ! | + | |
| - | * timp de execuție | + | |
| - | * C++: 1s | + | |
| - | * Java: 8s | + | |
| - | + | ||
| - | + | ||
| - | </note> | + | |
| - | === Task-3: TODO === | + | Enunț: Se dă o matrice de dimensiune ''N × N'' care reprezintă potențialele distanțe minime dintre oricare două noduri dintr-un graf orientat (adică rezultatul aplicării algoritmului Roy-Floyd). Se cere să se verifice dacă această matrice este validă și, în caz afirmativ, să se determine numărul minim de muchii pe care ar trebui să le aibă graful inițial pentru a genera exact aceste distanțe. |
| - | Rezolvați problema [[ TODO link | TODO ]] pe TODO. | + | |
| - | === Task-4: TODO === | + | Date de intrare: Numărul de teste ''T''. Pentru fiecare test, se dă numărul de noduri ''N'', urmat de o matrice de dimensiune ''N × N'' ce reprezintă distanțele. |
| - | Rezolvați problema [[ TODO link | TODO ]] pe TODO. | + | |
| - | === Task-5: TODO === | + | Date de ieșire: Pentru fiecare test, se va afișa pe o linie separată "NU" dacă nu se poate construi un astfel de graf. Dacă este posibil, se va afișa "DA", urmat de un spațiu și de numărul minim de muchii ale grafului inițial. |
| - | Rezolvați problema [[ TODO link | TODO ]] pe TODO. | + | |
| - | ==== BONUS ==== | + | Problema se poate testa la: |
| + | [[https://infoarena.ro/problema/rfinv|Infoarena - rfinv]] | ||
| - | La acest laborator, asistentul va alege 1-2 probleme din secțiunea extra. | ||
| ==== Extra ==== | ==== Extra ==== | ||