Cod sursa(job #643274)

Utilizator mihaidutescuDutescu Mihai mihaidutescu Data 3 decembrie 2011 12:49:36
Problema Algoritmul Bellman-Ford Scor 35
Compilator cpp Status done
Runda Arhiva educationala Marime 1.38 kb
#include <cstdio>

struct vecin
{
	int nod,cost;
	vecin* adr_urm;
};

vecin *vec[50001];

struct elc
{
	int nod;
	elc* adr_urm;
};

elc *top;

unsigned short int numapp[50001],eincoada[50001];

void vpush(int x,int y,int c)
{
	vecin* tmp=new vecin;
	tmp->nod=y;
	tmp->cost=c;
	tmp->adr_urm=vec[x];
	vec[x]=tmp;
}

int push(int n)
{
	if(eincoada[n])
		return 0;
	eincoada[n]=1;
	numapp[n]++;
	elc* tmp=new elc;
	tmp->nod=n;
	tmp->adr_urm=top;
	top=tmp;
	return 1;
}

void pop()
{
	eincoada[top->nod]=0;
	elc *tmp=top;
	top=top->adr_urm;
	delete tmp;
}

int main()
{
	int cost[50001],n,m,x,y,c,nod;
	bool cicneg=false;
	top=NULL;
	for(int i=0;i<=50000;i++)
	{
		cost[i]=2100000000;
		eincoada[i]=numapp[i]=0;
		vec[i]=NULL;
	}
	FILE *f=fopen("bellmanford.in","r");
	fscanf(f,"%d %d\n",&n,&m);
	for(int i=0;i<=m;i++)
	{
		fscanf(f,"%d %d %d",&x,&y,&c);
		vpush(x,y,c);
	}
	fclose(f);
	cost[1]=0;
	push(1);
	while(top&&!cicneg)
	{
		nod=top->nod;
		pop();
		for(vecin* curs=vec[nod];curs;curs=curs->adr_urm)
			if(cost[nod]+curs->cost<cost[curs->nod])
			{
				cost[curs->nod]=cost[nod]+curs->cost;
				if(push(curs->nod))
					if(numapp[curs->nod]>n)
						cicneg=true;
			}
	}
	f=fopen("bellmanford.out","w");
	if(cicneg)
		fprintf(f,"Ciclu negativ!");
	else
		for(int i=2;i<=n;i++)
			fprintf(f,"%d ",cost[i]);
	return 0;
}