Cod sursa(job #390954)

Utilizator ada_sAda-Mihaela Solcan ada_s Data 4 februarie 2010 20:43:34
Problema Drumuri minime Scor 15
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.82 kb
#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 t, *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++)
		{
			t=(dist[nod]+c[nod][i])-dist[a[nod][i]];
			if (t<0)
				t*=-1;
			if (t<=EPS)
			{
				q[u]=a[nod][i];
				if (u<NMAX)
					u++;
				else
					u=0;
					nr[a[nod][i]]++;
			}//if
			else
			{
				t=dist[a[nod][i]]-(dist[nod]+c[nod][i]);
				if (t>EPS)
				{
					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
			}//else
		}//for i
	}//while
	if (cicluNeg)
		return 1;
	else
		return 0;
}//bellmanford