Pagini recente » Cod sursa (job #2052068) | Cod sursa (job #1741853) | Cod sursa (job #464518) | Cod sursa (job #1623477) | Cod sursa (job #2843879)
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#define N 50000
#define M 250000
#define INF 1e8
typedef struct
{
int e, urm;
} element;
typedef struct
{
int x, y, c;
} muchie;
int lst[N+1], n, m, nr, d[N+1], q[N+1], nr_q[N+1];
bool in_q[N+1];
element v[M+1];
muchie e[M+1];
void adauga(int x, int i_e)
{//adauga pe y in lista de adiacenta a lui x
v[++nr].e = i_e;
v[nr].urm = lst[x];
lst[x] = nr;
}
void initializeaza(int x0)
{
for (int i = 1; i <= n; i++)
{
d[i] = INF;
}
d[x0] = 0;
}
bool actualizeaza()
{
bool actual = false;
for (int i = 1; i <= m; i++)
{
int x = e[i].x, y = e[i].y, c = e[i].c;
if (d[x] + c < d[y])
{
d[y] = d[x] + c;
actual = true;
}
}
return actual;
}
int urmatorul(int p)
{
p++;
if (p == N+1)
{
p = 0;
}
return p;
}
bool bellmanford(int x0)
{
initializeaza(x0);
int st = 0, dr = 0;
q[dr] = x0;
in_q[x0] = true;
nr_q[x0]++;
while (urmatorul(dr) != st)
{
int x = q[st];
st = urmatorul(st);
in_q[x] = false;
for (int p = lst[x]; p != 0; p = v[p].urm)
{
int y = e[v[p].e].y;
int c = e[v[p].e].c;
if (d[x] + c < d[y])
{
d[y] = d[x] + c;
if (!in_q[y])
{
dr = urmatorul(dr);
q[dr] = y;
in_q[y] = true;
nr_q[y]++;
if (nr_q[y] == n)
{
return false;
}
}
}
}
}
return true;
}
int main()
{
FILE *in, *out;
in = fopen("bellmanford.in", "r");
out = fopen("bellmanford.out", "w");
fscanf(in, "%d%d", &n, &m);
for (int i = 1; i <= m; i++)
{
fscanf(in, "%d%d%d", &e[i].x, &e[i].y, &e[i].c);
adauga(e[i].x, i);
}
fclose(in);
if (!bellmanford(1))
{
fprintf(out, "Ciclu negativ!");
}
else
{
for (int i = 2; i <= n; i++)
{
fprintf(out, "%d ", d[i]);
}
}
fclose(out);
return 0;
}