Documente Academic
Documente Profesional
Documente Cultură
Algoritmul Lui Dijkstra
Algoritmul Lui Dijkstra
Cerinta
Sa se determine lungimea minima a drumului de la nodul 1 la fiecare din nodurile 2, 3, ..., N-1, N si sa
se afiseze aceste lungimi. Lungimea unui drum este data de suma lungimilor arcelor care constituie
drumul.
Date de intrare
Fisierul de intrare dijkstra.in contine pe prima linie numerele N si M, separate printr-un spatiu, cu
semnificatia din enunt. Urmatoarele M linii contin, fiecare, cate 3 numere naturale separate printr-un
spatiu A B C semnificand existenta unui arc de lungime C de la nodul A la nodul B.
Date de iesire
In fisierul de iesire dijkstra.out veti afisa pe prima linie N-1 numere naturale separate printr-un
spatiu. Al i-lea numar va reprezenta lungimea unui drum minim de la nodul 1 la nodul i+1.
Restrictii
1 N 50 000
1 M 250 000
Exemplu
dijkstra.in
dijkstra.out
5 6
1 3 2 5
1 2 1
1 4 2
4 3 4
2 3 2
4 5 3
3 5 6
Indicatii de rezolvare
Exista o descriere a algoritmului pe wikipedia.
O rezolvare de complexitate O(N2) obtine 40 de puncte si se poate gasi aici.
O rezolvare in O(MlogN) folosind un heap obtine 100 de puncte si se poate gasi aici. O descriere a
acestei structuri de date puteti gasi tot pe wikipedia. O implementare de aceeasi complexitate
foloseste in loc de heap structura de date numita SET, care este de fapt un arbore binar echilibrat si
permite interogarea costului minim si modificarea costurilor in timp logaritmic. Aceasta abordare se
gaseste aici si are avantajul ca necesita un cod mult mai scurt. Totusi, ea este mai inceata decat
solutia cu heap-uri si, in consecinta, obtine doar 80 de puncte.
O alta rezolvare utila in concursuri este algoritmul Bellman-Ford cu coada. Desi are complexitatea
teoretica O(N*M), in practica solutia se dovedeste destul de rapida pentru a trece toate testele.