Pagini recente » Cod sursa (job #952792) | Cod sursa (job #873659) | Cod sursa (job #3166907) | Cod sursa (job #279794) | Cod sursa (job #3226858)
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#define INF 1000000000
#define N 50000
#define M 250000
typedef struct
{
int vf, urm, c;
} element;
int n, nr, lst[N+1], d[N+1], pred[N+1], nrq[N+1], q[N+1];
bool inq[N+1];
element v[M+1];
void adauga(int x, int y, int c)
{
v[++nr].vf = y;
v[nr].urm = lst[x];
v[nr].c = c;
lst[x] = nr;
}
int urmator_circular(int p)
{
p++;
if (p == N)
{
p = 0;
}
return p;
}
void adauga_q(int *pdr, int x)
{
*pdr = urmator_circular(*pdr);
q[*pdr] = x;
inq[x] = true;
nrq[x]++;
}
void elimina_q(int *pst)
{
int x = q[*pst];
*pst = urmator_circular(*pst);
inq[x] = false;
}
bool coada_vida(int st, int dr)
{
return (urmator_circular(dr) == st);
}
bool moore(int x0)
{
///initializarea
for (int i = 1; i <= n; i++)
{
d[i] = INF;
pred[i] = 0;
nrq[i] = 0;
inq[i] = false;
}
int st = 0, dr = -1;
adauga_q(&dr, x0);
d[x0] = 0;
while (!coada_vida(st, dr))
{
int x = q[st];
elimina_q(&st);
for (int p = lst[x]; p != 0; p = v[p].urm)
{
int y = v[p].vf;
int c = v[p].c;
if (d[x] + c < d[y])
{
d[y] = d[x] + c;
pred[y] = x;
if (!inq[y])
{
adauga_q(&dr, y);
if (nrq[y] == n)
{
return false;
}
}
}
}
}
return true;
}
int main()
{
FILE *in, *out;
in = fopen("bellmanford.in", "r");
out = fopen("bellmanford.out", "w");
int m;
fscanf(in, "%d%d", &n, &m);
for (int i = 0; i < m; i++)
{
int x, y, c;
fscanf(in, "%d%d%d", &x, &y, &c);
adauga(x, y, c);
}
if (!moore(1))
{
fprintf(out, "Ciclu negativ!\n");
}
else
{
for (int i = 2; i <= n; i++)
{
fprintf(out, "%d ", d[i]);
}
}
fclose(in);
fclose(out);
return 0;
}