Pagini recente » Cod sursa (job #2944077) | Cod sursa (job #1242961) | Cod sursa (job #1322208) | Cod sursa (job #1122306) | Cod sursa (job #390919)
Cod sursa(job #390919)
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
const long NMAX=50010;
const long MMAX=250010;
const long INF=100000000;
const double EPS=0.0000000001;
long q[NMAX], *a[NMAX], n, x[MMAX], y[MMAX], m, d[NMAX], cont[NMAX], nr[NMAX];
int z[MMAX];
bool rez;
double *c[NMAX], dist[NMAX];
bool bellmanford(long nod);
int main()
{
long i;
freopen("dmin.in", "r", stdin);
freopen("dmin.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]]++;
d[y[i]]++;
}//for i
for (i=1; i<=n; i++)
{
a[i]=new long[d[i]+1];
c[i]=new double[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]][a[x[i]][0]]=log(z[i]);
a[y[i]][++a[y[i]][0]]=x[i];
c[y[i]][a[y[i]][0]]=log(z[i]);
}//for i
rez=bellmanford(1);
if (rez)
printf("Ciclu negativ!");
else
for (i=2; i<=n; i++)
printf("%ld ", nr[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;
nr[nod]=1;
dist[nod]=0;
cicluNeg=0;
while ((p!=u)&&(!cicluNeg))
{
nod=q[p];
if (p<NMAX)
p++;
else
p=0;
for (i=1; i<=a[nod][0]; i++)
if (abs(dist[a[nod][i]]-(dist[nod]+c[nod][i]))<=EPS)
{
q[u]=a[nod][i];
if (u<NMAX)
u++;
else
u=0;
nr[a[nod][i]]++;
}//if
else
if (dist[a[nod][i]]>(dist[nod]+c[nod][i]))
{
if (cont[a[nod][i]]>n)
cicluNeg=1;
else
{
q[u]=a[nod][i];
if (u<NMAX)
u++;
else
u=0;
cont[a[nod][i]]++;
}//else
dist[a[nod][i]]=dist[nod]+c[nod][i];
nr[a[nod][i]]=1;
}//if
}//while
if (cicluNeg)
return 1;
else
return 0;
}//bellmanford