# PBinfo #588 – Dijkstra – Rezolvare C++

Sursa: Codul lui Andrei
Limbaj: C++
Autor rezolvare: andrei

## Enunț

Cerința
Se dă un graf orientat ponderat cu n noduri – în care fiecare arc are asociat un cost, număr natural strict pozitiv, și un nod p. Să se determine, folosind algoritmul lui Dijkstra, costul minim al drumului de la p la fiecare nod al grafului. 

Date de intrare
Fișierul de intrare dijkstra.in conține pe prima linie numerele n p, iar următoarele linii câte un triplet i j c, cu semnificația: există arcul (i j) și are costul c.

Date de ieșire
Fișierul de ieșire dijkstra.out va conține pe prima linie n numere, separate prin exact un spațiu, al i-lea număr reprezentând costul drumului minim de la p la i. Dacă nu există drum de la p la un anumit vârf, costul afișat va fi -1.

Restricții și precizări

1 ≤ n ≤ 100
costul unui arc va fi mai mic decât 1000
costul unui drum este egal cu suma costurilor arcelor care îl compun

Exemplu:
dijkstra.in

5 4
1 3 1
2 1 2
4 2 1
4 3 8
5 3 5
5 4 2
dijkstra.out

3 1 4 0 -1

## Cod sursă C++

```cpp
#include <iostream>
#include <fstream>
#define INFINIT 1000000000
using namespace std;
ifstream fin("dijkstra.in");
ofstream fout("dijkstra.out");
int n , a[105][105], v[105], d[105], t[105];
int main()
{
    int i , j , c , p;
    fin >> n >> p;
    for(i =1 ; i <= n ; ++i)
		for(j = 1 ; j <= n ; ++j)
			a[i][j] = INFINIT;
    while( fin >> i >> j >> c )
    	a[i][j] = c;
	for(i =1 ; i <= n ; i ++ )
	{
		v[i] = 0;
		d[i] = a[p][i];
		t[i] = p;
	}
	v[p] = 1, t[p] = 0, d[p] = 0;
	d[0] = INFINIT;
	for(int k = 1 ; k < n ; ++k)
	{
		int pmax = 0;
		for(i = 1 ; i <= n ; ++i)
			if(v[i] == 0 && d[i] < d[pmax])
				pmax = i;
		if(pmax > -1)
		{
			v[pmax] = 1;
			for(i = 1; i <= n ; ++i)
				if(v[i] == 0 && d[i] > d[pmax] + a[pmax][i])
					d[i] = d[pmax] + a[pmax][i], t[i] = pmax;
		}
	}
	for(i = 1 ;i <= n ; ++i)
		fout << (d[i] != INFINIT ? d[i] : -1) << " ";
    return 0;
}
```

## Resurse

- [Pagina originală](https://codulluiandrei.ro/rezolvari/pbinfo/588)
- [Sursa C++](https://codulluiandrei.ro/rezolvari/pbinfo/588/cod.cpp)
- [Sursa pe GitHub](https://raw.githubusercontent.com/codulluiandrei/pbinfo/main/pbinfo-588/main.cpp)
- [Cursuri de informatică pentru BAC](https://codulluiandrei.ro/academia/info-curs/pachet-cpp/)
