Cod sursa(job #498046)

Utilizator Cristy94Buleandra Cristian Cristy94 Data 3 noiembrie 2010 21:48:50
Problema Algoritmul Bellman-Ford Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.18 kb
#include<stdio.h>
#include<vector>
#define inf 2000000000
using namespace std;
FILE *f=fopen("ciclu.in","r");
FILE *g=fopen("ciclu.out","w");
int d[1001],N,M,init[1001][1001],x,y,z,m,c[10000001],cu,cp,nr[1001],s[1001],ok,sol,maxN;
vector <int> a[1001];
void citire(){
	fscanf(f,"%d%d",&N,&M);
	for(int i=1;i<=M;i++){
		fscanf(f,"%d%d%d",&x,&y,&z),init[x][y]=z*100,a[x].push_back(y);
		if(init[x][y] > maxN)
			maxN=init[x][y];
	}
	for(int i=1;i<=N;i++)
		a[0].push_back(i);
}
void initi(){
	for(int i=1;i<=N;i++)
		d[i]=inf,nr[i]=0,s[i]=0;
	cp=1,cu=1,ok=1,c[1]=0;
}

void bell()
{  while(cp<=cu)
   {   int nrc=c[cp];
       int cate=a[nrc].size();
	   for(int j=0;j<cate;j++)
	   { int i=a[nrc][j];
		   int what=init[nrc][i]-m;
		   if( d[nrc] + what <= d[i] )
		   { d[i]=d[nrc]+what,nr[i]++;
			 if(nr[i]>=N)
			 { ok=0;return;}
			 if(s[i]==0)
			 c[++cu]=i,s[i]=1;
		   }
	   }
	   cp++,s[nrc]=0;
   }		
}

void cautare(){
	int p=0,u=maxN;
	while(p<=u){
	m=(p+u)/2,initi(),bell();
	if(!ok)
		sol=m,u=m-1;
	else p=m+1;		
	}
}

void afis(){
	float x=sol/float(100);
	fprintf(g,"%.2f",x);
}
int main(){
	citire();
	cautare();
	afis();
return 0;
}