Responsabili:
O hartă rutieră a unui oraș, definită prin intersecții și străzi între aceste intersecții, poate fi reprezentată sub forma unui graf orientat în care nodurile reprezintă intersecțiile, iar muchiile reprezintă străzile (vom considera străzile că fiind unidirecționale). O astfel de reprezentare a unei hărți rutiere este foarte eficientă pentru a determina diferite proprietăți ale acesteia (conectivitatea între diferite intersecții, care sunt cele mai frecventate rute, cel mai scurt drum între două puncte de interes etc.).
Fiind date intersecțiile în ordinea lor lexicografică și străzile dintre ele, să se afișeze următoarele informații:
Noțiunile definite mai sus vor fi explicate în detaliu în secțiunea următoare.
La acest task va trebui să verificați dacă pentru o pereche de intersecții (start, end) există un drum valid de la start la end. În cazul în care există va trebui să scrieți în fișier y, iar în caz contrar n.
Asemănător primului task, va trebui să afișați distanta dintre două intersecții primite la input. În cazul în care există drum, veți afișa un număr întreg reprezentând lungimea drumului, altfel -1.
Harta poate suferi modificări pe parcurs. Aceste modificări pot fi de tipul adăugare drum între două intersecții, schimbarea sensului unui drum, transformarea unui drum unidirecțional în unul bidirecțional sau blocarea totală a unui drum. Având informații despre toate aceste modificări, și interogări pe parcursul modificărilor, va trebui să afișați dacă există un drum între două intersecții, distanța între două intersecții și distanța dintre două intersecții trecând obligatoriu printr-o a treia intersecție (oprire intermediară).
Dorim să simulăm comportamentul aplicației unui serviciu de curse tip Uber. Harta folosită este cea obținută în urmă modificărilor de la task 3. Veți primi un set de query-uri de tipul (start, destinație, rating) simbolizând poziția de start a unui client, destinația și rating-ul pe care îl va oferi șoferului în urma călătoriei. Va trebui să determinați șoferul care va îndeplini călătoria. Pentru această vom alege cel mai apropiat șofer de poziția de start. Dacă există mai mulți șoferi aflați la aceeași distanță se va alege șoferul cu ratingul mediu mai bun. Dacă șoferii au același rating mediu, se va alege șoferul cu numele mai mic din punct de vedere lexicografic. În cazul în care niciun șofer nu poate să ajungă la poziția de start, se va afișa mesajul “Nu există șoferi disponibili!”. Dacă destinația nu este accesibilă din punctul de start, inițial se va încerca să se ajungă la oricare din nodurile vecine destinației(pentru care există drum de la destinație la ele); dacă nu este posibil acest lucru, se va afișa mesajul “Destinație inaccesibilă!”. După ce un șofer duce o cursă la sfârșit, noua lui poziție va fi actualizată cu destinația cursei.
Pentru a adaugă șoferi pe hartă, printre aceste query-uri veți primi și input de adăugare a șoferilor, actualizare a poziției și/sau statusului. Un șofer poate avea două statusuri: online și offline. În momentul în care un șofer își schimbă statusul în offline acesta nu mai poate prelua curse. Dacă își schimbă statusul din nou în online, va putea prelua curse. Atenție, în momentul în care un șofer devine din nou online va putea prelua din nou clienți și își va păstra toate statisticile de dinainte. De asemenea, în momentul în care redevine online acesta se poate afla în altă intersecție decât în cea în care se afla anterior.
De asemenea, între călătorii veți avea query-uri care vă vor cere topuri/informații despre statisticile ce trebuie colectate: rating mediu al fiecărui șofer, distanța parcursă în total, numărul de curse îndeplinite și locația actuală a acestuia. Pentru a răspunde la aceste query-uri veți ține cont și de șoferii care sunt online, dar și de cei offline. Inițial toți șoferii vor avea rating = 0.00, distanță = 0 și curse = 0.
Amănunte despre aceste query-uri veți găsi în secțiunea de detaliere a inputului.
La finalul zilei, după ce toate cursele au fost duse la îndeplinire și șoferii se află în noile locații, vrem să vedem ce destinații sunt disponibile având la dispoziție o anumită cantitate de combustibil. Va trebui ca pentru un șofer, o cantitate de combustibil și o listă de puncte de interes să afișați intersecțiile în ordine crescătoare a combustibilului rămas la finalul călătoriei către fiecare punct de interes. Considerăm consumul ca fiind 1 unitate de volum / 1 unitate de distanță. Dacă o intersecție nu e accesibilă sau cantitatea de combustibil e insuficientă, nu o vom afișa la output. Pentru cantități egale de combustibil rămas, intersecțiile se vor afișa în ordine lexicografică.
8 11 Berceni Chibrit Constitutiei Dorobanti Iancului Operei Romana Unirii Chibrit Berceni Berceni Romana Chibrit Romana Constitutiei Chibrit Constitutiei Dorobanti Iancului Romana Romana Iancului Operei Romana Iancului Operei Dorobanti Iancului Iancului Dorobanti 3 Berceni Constitutiei Operei Dorobanti Chibrit Operei 3 Chibrit Operei Romana Constitutiei Berceni Dorobanti 10 c Romana Iancului 1 q Romana Dorobanti 0 c Constitutiei Dorobanti 3 q Iancului Constitutiei 1 q Constitutiei Romana 2 Berceni c Constitutiei Romana 0 c Operei Romana 2 q Constitutiei Operei 1 c Operei Iancului 2 c Constitutiei Dorobanti 3 16 d Andrei Berceni d Bogdan Romana r Operei Dorobanti 4 r Operei Iancului 4 top_dist 6 d Mihaita Berceni r Berceni Operei 3 b Bogdan top_rating 2 info Mihaita r Romana Constitutiei 5 r Berceni Unirii 4 r Constitutiei Romana 2 d Bogdan Constitutiei r Constitutiei Iancului 5 info Bogdan 1 Bogdan 6 Operei Iancului Operei Romana Dorobanti Chibrit
Mai jos aveți reprezentarea grafului înainte și după modificările din task-ul 3. Vom indexa nodurile de la 0.
Inițial:
Final:
Task1.out: Q1 linii de forma y/n în funcție de răspunsul la query. Pe prima linie se va află răspunsul la primul query, pe a două linie la al doilea, etc.
Task2.out: Q2 linii de forma <distanta_drum>, cu semnificația că pe prima linie se află răspunsul la primul query, pe a doua linie răspunsul la al doilea query, etc. Obs.: În cazul în care vi se cere lungimea unui drum indisponibil (nu avem drum între cele două intersecții), veți afișa -1.
Task3.out: Pe fiecare linie veți răspunde la query-urile întâlnite în inputul task-ului 3, asemănător task-urilor 1 și 2. Veți afișa y/n pentru query-urile de tip “există drum”, și un număr întreg pentru query-urile care cer lungimea drumului. În continuare în cazul unui drum indisponibil vom afișa -1 pentru lungimea sa.
Task4.out: Pe fiecare linie veți afișa output-ul query-urilor întâlnite în input-ul task-ului 4. Pentru query de tip top: <nume_1:valoare nume2:valoare … >, unde nume_i reprezintă numele șoferului i în top-ul cerut, iar valoare este valoarea cerută în top, și va fi un int în cazul curselor și distanței, și un float cu 2 zecimale în cazul mediei. În cazul query-ului tip info veți afișa <nume_șofer: locație rating curse distanță online/offline>, cu semnificația că locație este intersecția în care se află în momentul de față șoferul, rating este rating-ul mediu al acestuia, curse reprezintă numărul de curse încheiate de șofer, distanță reprezintă distanță totală parcursă de acesta pentru curse, iar online/offline este un tag care ne spune dacă șoferul în momentul de față este disponibil în aplicație sau nu. Dacă șoferul este offline locația acestuia va fi ultima intersecție în care s-a aflat înainte de a-și schimba statusul.
Task5.out: Veți afișa o singură linie de forma <intersecție_1 intersecție_2 … >, care va conține numele intersecțiilor ordonate după combustibilul rămas șoferului dacă ar merge din poziția lui actuală până în fiecare dintre intersecții. Intersecțiile în care nu poate ajunge (dacă nu are destul combustibil sau dacă nu e accesibilă) nu vor mai fi afișate. Dacă o intersecție apare de mai multe ori în input aceasta va fi afișată o singură dată.
n y y
3 -1 3
n 2 3 2
Bogdan:6 Andrei:0 Bogdan:4.00 Andrei:3.00 Mihaita: Berceni 0.00 0 0 online Destinatie inaccesibila Soferi indisponibili Bogdan: Iancului 4.33 3 8 online
Iancului Dorobanti Operei
NU puteți folosi map, unordered_map, set, unordered_set, priority_queue. De asemenea, nu puteți folosi sort (sau orice operatie de sortare/heap) din algorithm.
Puteți folosi următoarele containere din STL pentru a vă facilita implementarea: vector, list, stack, queue.
Veți rezolva fiecare din cele 5 task-uri în funcția corespunzătoare din fișierul Solver.h
aflat în arhivă.
Pe lângă acestea puteți implementa orice funcții considerați că aveți nevoie.
Pe vmchecker veți face upload la o arhivă ce va conține fișierele sursă folosite în implementare, Makefile și README.
Executabilul generat trebuie să se numească tema2
.
De aceea, vă sfătuim să nu vă lăsați rezolvări ale temelor pe calculatoare partajate (la laborator etc), pe mail/liste de discuții/grupuri etc.