Cod sursa(job #794724)

Utilizator hasegandaniHasegan Daniel hasegandani Data 6 octombrie 2012 21:47:36
Problema Algoritmul Bellman-Ford Scor 35
Compilator cpp Status done
Runda Arhiva educationala Marime 1.17 kb
#include <cstdio>
#include <vector>
#include <algorithm>
#include <queue>

using namespace std;

const int Nmax = 50010;
const int inf = 0x3f3f3f3f;

int N,M;
vector < pair<int,int> > L[Nmax];
int sol[Nmax],cnt[Nmax];

void solve()
{
	int current;
	queue<int> q;
	vector< pair<int,int> >::iterator it;

	for(int i=2;i<=N;++i)
		sol[i] = inf;
	sol[1] = 0;

	q.push(1);

	while (!q.empty())
	{
		current = q.front();
		q.pop();

		for(it = L[current].begin(); it != L[current].end() ; ++it)
			if (sol[ (*it).first ] > sol[current] + (*it).second)
			{
				sol[ (*it).first ] = sol[current] + (*it).second;
				q.push( (*it).first );
				cnt[ (*it).first ] ++;
				if (cnt[ (*it).first ] == N || (*it).first == 1)
				{
					printf("Ciclu Negativ!\n"); 
					return ;
				}
			}
	}

	for(int i=2;i<=N;++i)
		printf("%d ",sol[i]);
	printf("\n");
}

void read()
{
	int a,b,c;
	scanf("%d",&N);
	scanf("%d",&M);
	for(int i=1;i<=M;++i)
	{
		scanf("%d%d%d",&a,&b,&c);
		L[a].push_back( make_pair(b,c) );
	}
}

int main()
{
	freopen("bellmanford.in","r",stdin);
	freopen("bellmanford.out","w",stdout);
	read();
	solve();
	return 0;
}