Cod sursa(job #645559)

Utilizator d.andreiDiaconeasa Andrei d.andrei Data 9 decembrie 2011 22:03:18
Problema Algoritmul Bellman-Ford Scor 65
Compilator cpp Status done
Runda Arhiva educationala Marime 1.24 kb
#include <cstdio>


#define file_in "bellmanford.in"
#define file_out "bellmanford.out"

#define nmax 250100

int N,M,i;
int d[nmax];
int x[nmax];
int y[nmax];
int c[nmax];

#define D 8192
char g_buf[D];
int g_p=D-1;


inline int get()
{

	int x=0,neg;
	while ((g_buf[g_p]<'0' || g_buf[g_p]>'9') && g_buf[g_p]!='-')
		if (++g_p==D) fread(g_buf,1,D,stdin),g_p=0;
	neg=0;
	if(g_buf[g_p]=='-'){	neg=1;
		if(++g_p==D) fread(g_buf,1,D,stdin),g_p=0;
	}
	while (g_buf[g_p]>='0' && g_buf[g_p]<='9'){
		x=x*10+g_buf[g_p]-'0';
		if (++g_p==D) fread(g_buf,1,D,stdin),g_p=0;
	}
	if (neg) x=-x;
	return x;
}

int main(){
	
	freopen(file_in,"r",stdin);
	freopen(file_out,"w",stdout);
	
	N=get();
	M=get();
	for (i=1;i<=M;++i){
		 //scanf("%d %d %d", &x[i], &y[i], &c[i]);
		x[i]=get(); 
		y[i]=get(); 
		c[i]=get(); 
		if (x[i]==1)
			 d[y[i]]=c[i];
	}
	
	for (i=2;i<=N;++i)
		 if (d[i]==0)
			 d[i]=0x3f3f3f3f;
		 
	int ok=0;

	int nr=0;
	while(!ok){
		ok=1;
		nr++;
		for (i=1;i<=M;++i)
			 if (d[y[i]]>d[x[i]]+c[i])
				 d[y[i]]=d[x[i]]+c[i],
				 ok=0;
				 //nr++;
		if (nr>nmax/10){
			printf("Ciclu negativ!\n");
			return 0;
			
		}
	}
	
	for (i=2;i<=N;++i)
		 printf("%d ", d[i]);
	
	return 0;
	
}