Pagini recente » Cod sursa (job #1410242) | Cod sursa (job #122122) | Cod sursa (job #18012) | Cod sursa (job #2520222) | Cod sursa (job #390777)
Cod sursa(job #390777)
#include <stdio.h>
const long NMAX=50010;
const long MMAX=250010;
const long INF=100000000;
long q[NMAX], *a[NMAX], n, x[MMAX], y[MMAX], dist[NMAX], m, d[NMAX], cont[NMAX];
int *c[NMAX], z[MMAX];
bool viz[NMAX], rez;
bool bellmanford(long nod);
int main()
{
long i;
freopen("bellmanford.in", "r", stdin);
freopen("bellmanford.out", "w", stdout);
scanf("%ld%ld", &n, &m);
for (i=1; i<=m; i++)
{
scanf("%ld%ld%d", &x[i], &y[i], &z[i]);
d[x[i]]++;
}//for i
for (i=1; i<=n; i++)
{
a[i]=new long[d[i]+1];
c[i]=new int[d[i]+1];
a[i][0]=0;
c[i][0]=0;
}//for i
for (i=1; i<=m; i++)
{
a[x[i]][++a[x[i]][0]]=y[i];
c[x[i]][++c[x[i]][0]]=z[i];
}//for i
rez=bellmanford(1);
if (rez)
printf("Ciclu negativ!");
else
for (i=2; i<=n; i++)
printf("%ld ", dist[i]);
return 0;
}//main
bool bellmanford(long nod)
{
long p=0, u=0, i;
bool cicluNeg=0;
for (i=1; i<=n; i++)
dist[i]=INF;
q[u]=nod;
if (u<NMAX)
u++;
else
u=0;
viz[nod]=1;
dist[nod]=0;
cicluNeg=0;
while ((p!=u)&&(!cicluNeg))
{
nod=q[p];
if (p<NMAX)
p++;
else
p=0;
viz[nod]=0;
for (i=1; i<=a[nod][0]; i++)
if ((dist[nod]+c[nod][i])<dist[a[nod][i]])
{
if (!viz[a[nod][i]])
{
if (cont[a[nod][i]]>n)
cicluNeg=1;
else
{
q[u]=a[nod][i];
if (u<NMAX)
u++;
else
u=0;
viz[a[nod][i]]=1;
cont[a[nod][i]]++;
}//else
}//if
dist[a[nod][i]]=dist[nod]+c[nod][i];
}//if
}//while
if (cicluNeg)
return 1;
else
return 0;
}//bellmanford