Pagini recente » Cod sursa (job #2777745) | Cod sursa (job #2791685) | Cod sursa (job #1748863) | Cod sursa (job #1943440) | Cod sursa (job #1885197)
#include <fstream>
#define infinit 9999999
#define nmax 110
#define IN "dijkstra.in"
#define OUT "dijkstra.out"
using namespace std;
ifstream fin("dijkstra.in");
ofstream fout("dijkstra.out");
int M[nmax][nmax], n, p, D[nmax];
void dijkstra(int x0)
{
int i, k, ok, minim, viz[nmax];
//initializez vectorul distantelor de la x0 la fiecare nod
for (i = 1; i <= n; i++)
{
D[i] = M[x0][i];
viz[i] = 0; //si marchez ca nevizitat nodul i
}
D[x0] = 0; viz[x0] = 1; ok = 1; //plec de la nodul de start (x0)
while (ok)
{
//caut nodul nevizitat aflat la diatnta minima
minim = infinit;
for (i = 1; i <= n; i++)
if (!viz[i] && minim > D[i])
{
minim = D[i];
k = i; //am gasit nodul i...il retin
}
//daca am gasit un nod (minim != infinit)
if (minim != infinit)
{
viz[k] = 1; //il vizitez
for (i = 1; i <= n; i++) //actualizez distantele din D[] care trec prin k
if (!viz[i] && D[i]>D[k] + M[k][i]) //pentru nodurile nevizitate
D[i] = D[k] + M[k][i];
}
else
ok = 0; //nu mai am nici un nod la care pot ajunge
}
}
int main()
{
int i, j, x, y, v;
//citesc numarul de noduri si nodul de la care calculez (nodul de start)
fin >> n >> p;
//initializez matricea costurilor
for (i = 1; i <= n; i++)
{
for (j = 1; j <= n; j++)
M[i][j] = infinit;
M[i][i] = 0;
}
//citesc arcele si costurile pe arce
while (fin >> x >> y >> v)
M[x][y] = v;
dijkstra(p);
//afisare vectorul de distante
for (i = 1; i <= n; i++)
if (D[i] != infinit)
fout << D[i] << ' ';
else
fout << "-1 ";
fout << '\n';
return 0;
}