Mai intai trebuie sa te autentifici.
Cod sursa(job #2487745)
Utilizator | Data | 5 noiembrie 2019 18:23:24 | |
---|---|---|---|
Problema | Algoritmul lui Dijkstra | Scor | 0 |
Compilator | cpp-64 | Status | done |
Runda | Arhiva educationala | Marime | 1.63 kb |
#include <fstream>
#define INF 99999
#define NMAX 1005
using namespace std;
ifstream fin("dijkstra.in");
ofstream fout("dijkstra.out");
void read();
void Dijkstra();
void write();
void path(int x);
struct varf
{
int x, c;
} a[NMAX][NMAX];
int n, m, dmin[NMAX], pre[NMAX][NMAX], gr[NMAX], drum[NMAX], start, vfmin;
bool f[NMAX];
int main()
{
read();
Dijkstra();
write();
return 0;
}
void read()
{
int i, x = 0;
fin >> n >> start;
while (fin >> x)
{
gr[x]++;
fin >> a[x][gr[x]].x >> a[x][gr[x]].c;
}
f[start] = true;
for (i = 1; i <= n; i++)
{
dmin[i] = INF;
pre[i][0] = 0; pre[i][1] = start;
}
pre[start][0] = pre[start][1] = 0; dmin[start] = 0;
for (i = 1; i <= gr[start]; i++)
dmin[a[start][i].x] = a[start][i].c;
}
void Dijkstra()
{
int x, i, j, vfmin = 0, cmin;
for (j = 0; j < n - 1; j++)
{
// aflu vfmin
cmin = INF + 1;
for (x = 1; x <= n; x++)
if (!f[x] && dmin[x] < cmin)
{
cmin = dmin[x];
vfmin = x;
}
if (cmin == INF)
break;
f[vfmin] = true;
for (i = 1; i <= gr[vfmin]; i++)
if (!f[a[vfmin][i].x])
{
if (dmin[a[vfmin][i].x] > dmin[vfmin] + a[vfmin][i].c)
{
dmin[a[vfmin][i].x] = dmin[vfmin] + a[vfmin][i].c;
pre[a[vfmin][i].x][1] = vfmin; pre[a[vfmin][i].x][0] = 1;
}
else
if (dmin[a[vfmin][i].x] == dmin[vfmin] + a[vfmin][i].c)
pre[a[vfmin][i].x][++pre[a[vfmin][i].x][0]] = vfmin;
}
}
}
void write()
{
int i, j, k, lg;
for (i = 1; i <= n; i++)
if (dmin[i] == INF)
fout << 0 << ' ';
else
{
fout << dmin[i] << ' ';
}
}