Pagini recente » Cod sursa (job #2671584) | Cod sursa (job #2175804) | Cod sursa (job #2948721) | Cod sursa (job #3246054) | Cod sursa (job #1341458)
#include <stdio.h>
#include <stdlib.h>
#define NMax 50005
#define MMax 250005
#define INF 50000000
FILE *fin = fopen("bellmanford.in", "rt");
FILE *fout = fopen("bellmanford.out", "wt");
int n, m;
int x[MMax], y[MMax], cost[MMax];
int d[NMax];
int *v[NMax], *co[NMax];
void read() {
fscanf(fin, "%d %d", &n, &m);
for (int i = 0; i < m; i++) {
fscanf(fin, "%d %d %d", &x[i], &y[i], &cost[i]);
d[x[i]] ++;
}
for (int i = 1; i <= n; i++) {
v[i] = (int *) malloc(d[i] * sizeof(int)); // alocare dimanica
co[i] = (int *) malloc(d[i] * sizeof(int));
d[i] = 0;
}
for (int i = 0; i < m; i++) {
// muchia x[i] -> y[i];
// v[i][j] este al j-lea vecin al nodului i (i = Nod; j = pozitie, indexata de la 0)
v [x[i]] [d[x[i]]] = y[i];
co[x[i]] [d[x[i]]] = cost[i];
d[x[i]] ++;
}
// am terminat reprezentarea grafului cu liste de adiacenta, alocate dinamic
}
int dmin[NMax];
int in, sf, c[70 * NMax];
void bellmanford() {
for (int i = 1; i <= n; i++) {
dmin[i] = INF;
}
dmin[1] = 0;
c[in] = 1;
while (in <= sf) {
int nod = c[in];
in++;
// sunt in nodul nod
for (int i = 0; i < d[nod]; i++) {
int newNod = v[nod][i]; // al i-lea vecin al nodului nod
if (dmin[newNod] > dmin[nod] + co[nod][i]) {
dmin[newNod] = dmin[nod] + co[nod][i];
sf++;
c[sf] = newNod;
}
}
}
}
void write() {
for (int i = 2; i <= n; i++) {
fprintf(fout, "%d ", dmin[i]);
}
fprintf(fout, "\n");
fclose(fout);
}
int main() {
read();
bellmanford();
write();
}