-
Notifications
You must be signed in to change notification settings - Fork 0
calex257/Graph_Store
Folders and files
| Name | Name | Last commit message | Last commit date | |
|---|---|---|---|---|
Repository files navigation
Timp implementare: 12 ore
Nota: Dijkstra, Kosaraju, DFS si majoritatea celorlalte functii specifice
grafurilor sunt preluate si adaptate din laborator, laborator facut
prin convertirea pseudocodului in cod C. Functiile pentru stiva si coada
sunt de asemenea preluate din laboratoare anterioare si consider ca sunt
suficient de straightforward pentru a nu necesita comentarii sau explicatii
suplimentare, avand nume sugestive. Am doua implementari pentru coada, una
generica si una in care elementul este de tip int pentru ca aveam nevoie la
task3 de o coada generica si nu voiam sa modific coada si stiva folosite la
celelalte task-uri pentru a nu strica ce functiona deja.
Pentru citirea datelor am folosit un buffer, functia fgets si apoi sscanf din
buffer pentru datele utile.
Exista functii de afisare care nu sunt apelate vreodata de program dar care
au fost folosite pentru debugging/sunt ramase din laboratoare.
Task 1:
E in principal algortimul lui Dijkstra adaptat din laborator. Am folosit
un vector de parinti pentru a putea reconstrui traseul recursiv dupa
ce am aflat distanta minima.
Task 2:
Am folosit algortimul lui Kosaraju adaptat din laborator. Fiecare componenta
tare conexa e reprezentata intr-un bitmask, la fel ca si vectorul visited
in care este tinuta evidenta nodurilor vizitate dupa un DFS. Am pus in bitmask
in ordine inversa fata de cea normala, nodurile cu index mic in graf fiind
mai aproape de MSB. Dupa primul DFS fac graful transpus si pentru fiecare
nod nevizitat din stiva fac cate un DFS pe graful transpus. Pentru asta
folosesc un alt bitmask pentru a retine ce noduri sunt vizitate. Retin
starea de dinainte de DFS si o compar cu cea de dupa DFS, componenta conexa
fiind starea_precedenta^starea_actuala(folosesc operatorul XOR). Sortez
vectorul de bitmask-uri folosind functia quicksort si afisez fiecare
componenta in parte.
Task 3:
Am urmat algortimul din hint usor modificat/completat. Pe langa masca si
numarul nodului am stocat in coada si costul pentru a ajunge in acea stare.
Pentru a avea informatiile acestea grupate am definit o structura node_state
cu campurile anterior mentionate. Pe baza nodurilor incluse am calculat atat
starea ideala care reprezinta solutia cat si domeniul(componenta conexa) pe care
se lucreaza. Am folosit doua cozi, una care sa retina toate starile vizitate
anterior si alta in care sunt starile de vizitat. Am iterat cat timp coada
cu starile de vizitat nu era goala si am verificat pe rand fiecare prim element
scoatandu-l din coada la finalul fiecarei iteratii.
Conditiile pentru a fi adaugat in coada de vizitare sunt daca nu a fost vizitat
deja si daca se afla in domeniul cerut.
Conditia pentru a determina daca a fost vizitat deja este
daca in coada de vizitate se mai afla un nod cu aceeasi stare, acelasi numar
al nodului si un cost mai mare sau egal cu cel al elementului curent(pentru a
permite optimizari ale traseului). Pentru a calcula domeniul am facut un sau(|)
pe biti intre masca in care retin care noduri sunt depozite si masca in
care retin ce noduri trebuie incluse. Pentru a verifica daca un element este
in domeniu practic am facut reuniunea dintre masca elementului si masca domeniului.
Acest rezultat trebuie mereu sa fie egal cu masca domeniului, in caz contrar
elementul nefiind in domeniu. Un element este solutie daca masca lui este egala
cu cea ideala si daca numarul nodului este egal cu cel din cea ideala si pentru
solutii am gasit-o pe cea de cost minim.About
University assignment focused on the implementation of various graph algorithms
Resources
Stars
Watchers
Forks
Releases
No releases published
Packages 0
No packages published