This is an old revision of the document!


skel_graph

In continuare vom mentiona cateva conventii/sfaturi/reguli pe care trebuie sa le aveti in vedere pentru restul semestrului. Unele precizari sunt specifice laboratoarelor de grafuri, altele sunt generale.

Pentru TOATE laboratoarele de grafuri, vom face conventia ca nodurile sunt indexate de la 1 (1, 2, 3, …, n). Justificare: In unele probleme vom adauga un nod fictiv 0 (si inca unul n + 1), de aceea este indicat sa avem acest index nefolosit.

$n$ = numar de noduri

$m$ = numar de muchii/arce (in functie de tipul grafului)

$adj[node]$ = lista de adiacenta a nodului node

$adj\_trans[node]$ = lista de adiacenta a nodului node in graful transpus

In general cand vorbim de muchii/arce, putem folosi urmatoarele notatii:

- in grafuri fara costuri pe muchii:

  • $(node, neigh): muchie/arc de la nodul node la neigh. Notație uzuală în parcurgeri, când vrem să evidențiem relația între noduri: în parcugere se trece din nodul curent (node) în vecin (neigh).
  * $(x, y)$ - muchie/arc de la nodul x la y. Notație uzuală când cele 2 noduri nu au **neapărat** o semnificație anume (exemplu o dinamică unde x și y sunt 2 noduri oarecare din graf). Se poate extinde intuitiv la triplet $(x, y, z)$.
  * $(i, j)$ - muchie/arc de la nodul i la j. Notație uzuală când facem foruri pentru initițializări, iar x și y sunt rezervate. Se poate extinde intuitiv la triplet $(i, j, k)$.
  [TODO - delete me]* $(u, v)$ - muchie/arc dela nodul u la v. Notația din pseudocodul de pe ocw.

- in grafuri cu costuri pe muchii:

  • putem nota costul cu c / w / c[x][y] / w[x][y]
  • exemple:
    • (node, neigh, c): muchie/arc de la nodul node la neigh de cost c
    • w[x][y]: muchie/arc de la nodul x la w de cost w[x][y]

Un tool care poate fi folosit pentru a desena grafuri se gaseste pe csacademy.

Orice tablou (vector/matrice/multidimensional etc) se va aloca folosind una din urmatoarele variante:

  • pe heap : se poate folosi vector / ArrayList sau new . [C++] observatie : adj[NMAX] este alocat tot pe heap, intrucat Task-ul este alocat pe heap (vezi in main)

Recomandam varianta cu vector/ArrayList.

Precizari:

  • Orice abatere de la aceste reguli va fi penalizata de checker, lucru asigurat prin testele mari (ultimele), care vor genera SEGFAULT daca nu se respecta alocarea.
  • La problemele bonus care NU au checker, asistentul va depuncta manual astfel de probleme grave. In principiu, este permisa orice forma de alocare care suporta dimensiunile indicate in enunt.

Exemplu de problema grava: [C++]: void f() { int v[n]; } (alocare de dimensiune variabila pe stiva), poate crapa stiva! (n poate fi mare). Interzicem folosirea acestui tip de alocare la PA. Pentru acest exemplu, scheletul va genera si o eroare de compilare, pentru a va atrage atentia ca NU ar trebui sa folositi acest tip de alocare, daca n poate sa fie mare! (grafuri mari)

Observatie: Precizarile mentionate sunt valabile doar pentru contextul PA, unde facem algoritmi eficienti si care dorim sa mearga pe dimensiuni cat mai mari! Asta nu inseamna ca in alte contexte (ex. multi-threaded) nu poti folosi VLA (variable length array on stack).

Scopul acestui paragraf este sa va atraga atentia asupra alocarii corespunzatoare a datelor la PA , astfel incat sa evitati erori de run time pe care sa nu vi le puteti explica.

pa/skel_graph.1618781955.txt.gz · Last modified: 2021/04/19 00:39 by darius.neatu
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