Pagini recente » Cod sursa (job #517497) | Cod sursa (job #3038139) | Cod sursa (job #503669) | Monitorul de evaluare | Cod sursa (job #3192690)
using namespace std;
#include<iostream>
#include<fstream>
#define NMAX 101
#define INF 1e9
ifstream fin("dijkstra.in");
ofstream fout("dijkstra.out");
int n, p;
int G[NMAX][NMAX];
int cmin[NMAX], pre[NMAX];
bool uz[NMAX]; ///uz[i] = 1 daca drumul minim de la p la i a fost deja calculat
void citire();
void dijkstra();
void afisare();
int main() {
citire();
dijkstra();
afisare();
return 0;
}
void citire() {
int i,j,c;
fin >> n >> p;
while (fin >> i >> j >> c) {
G[i][j] = c;
}
}
void dijkstra() {
///initializare
int minim, vfmin;
for (int i = 1; i<=n; i++) {
if (G[p][i]) {
cmin[i] = G[p][i];
} else {
cmin[i] = INF;
}
pre[i] = p;
}
uz[p] = 1;
cmin[p] = 0, pre[p] = 0;
for (int i = 1; i<n; i++) {
//determin minimul din cmin pt varfurile x pt care uz[x] == 0
minim = INF+1;
for (int x = 1; x<=n; x++) {
if (uz[x] == 0 && cmin[x] < minim) {
minim = cmin[x];
vfmin = x;
}
}
if (minim == INF) break;
//vfmin este selectat
uz[vfmin] = 1;
//optimizez eventual costurile catre celelalte varfuri, trecand prin vfmin
for (int x = 1; x<=n; x++) {
if (!uz[x] && G[vfmin][x] && cmin[x] > cmin[vfmin] + G[vfmin][x]) {
cmin[x] = cmin[vfmin] + G[vfmin][x];
pre[x] = vfmin;
}
}
}
}
void afisare() {
for (int i = 1; i<=n; i++) {
if (cmin[i] == INF) {
cmin[i] = -1;
}
fout << cmin[i] << " ";
}
}