Cod sursa(job #662849)

Utilizator angi.nNeata Angelica angi.n Data 17 ianuarie 2012 02:25:35
Problema Algoritmul Bellman-Ford Scor 35
Compilator cpp Status done
Runda Arhiva educationala Marime 1.18 kb
#include<fstream>
#include<iostream>
#include<stdlib.h>
#include<vector>
#define inf 1<<30
 using namespace std;
ifstream in("bellmanford.in");
ofstream out("bellmanford.out");
int coada[2*250001];

typedef struct muchie
{
	int x,cost;
}muchie;
vector<muchie> v_m[50001];
void blf(int *vizitat,int *cost,int n)
{
	int i,p=0,x,v=1,aux;
	vizitat[1]=1;
	coada[v]=1;
	for(i=2;i<=n;i++)
		cost[i]=inf;
	
	while(p!=v)
	{
		p++;
		x=coada[p];
		for(i=0;i<v_m[x].size();i++)
		{
			aux=v_m[x][i].x;
			if(cost[x]+v_m[x][i].cost<cost[aux])
			{
				cost[aux]=cost[x]+v_m[x][i].cost;
				if(vizitat[aux]>n && cost[aux]<0)
				{
					out<<"exista ciclu negativ!\n";
					return ;
				}
				vizitat[aux]++;
				v++;
				coada[v]=aux;
			}
		}
	}
	for(i=2;i<=n;i++)
		if(cost[i]==inf)
			out<<"0\t";
		else
			out<<cost[i]<<"\t";
}
int main()
{
	int x,y,*cost,i,n,m,*vizitat,cst;
	muchie t;
	in>>n>>m;
	vizitat=( int *)malloc((n+1)*sizeof( int ));
	cost=( int *)malloc((n+1)*sizeof( int ));
	//citire
	for(i=1;i<=m;i++)
	{
		in>>x>>y>>cst;
		t.x=y;
		t.cost=cst;
		v_m[x].push_back(t);
	}

	blf(vizitat,cost,n);
	free(vizitat);
	free(cost);

	return 0;
}