Cod sursa(job #1206382)

Utilizator abel1090Abel Putovits abel1090 Data 9 iulie 2014 19:31:25
Problema Algoritmul Bellman-Ford Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.62 kb
///BEALLMAN_FORD
#include <fstream>
#include <iostream>
#include <vector>
#include <list>
#include <limits>
#include <queue>

using namespace std;

typedef pair<int, unsigned> NODE;
typedef numeric_limits<int> I_LIM;

void bellmanFord(vector<list<NODE> >& adjList,
		vector<int>& output, bool& isNegativeCycle) {
	unsigned numNodes = adjList.size();
	queue<unsigned> q;
	vector<bool> isInQueue(numNodes, false);
	vector<unsigned> countQueue(numNodes, 0);

	q.push(0);
	output[0] = 0;

	list<NODE>::iterator it;
	unsigned current;
	while(!q.empty() && !isNegativeCycle) {
		current = q.front();
		q.pop();
		isInQueue[current] = false;

		for(it = adjList[current].begin(); it != adjList[current].end(); it++)
			if(output[current] + it->first < output[it->second]) {
				output[it->second] = output[current] + it->first;

				if(!isInQueue[it->second]) {
					q.push(it->second);
					isInQueue[it->second] = true;
					countQueue[it->second]++;

					if(countQueue[it->second] > numNodes)
						isNegativeCycle = true;
				}
			}
	}
}

int main() {
	ifstream inStr("bellmanford.in");
	ofstream outStr("bellmanford.out");

	unsigned numNodes, numEdges;
	inStr >> numNodes >> numEdges;

	vector<list<NODE> > adjList(numNodes);
	vector<int> output(numNodes, I_LIM::max());
	bool isNegativeCycle = false;

	unsigned from, to;
	int cost;
	for(unsigned i=0; i < numEdges; i++) {
		inStr >> from >> to >> cost;
		adjList[--from].push_back(NODE(cost, --to));
	}

	bellmanFord(adjList, output, isNegativeCycle);

	if(isNegativeCycle)
		outStr << "Ciclu negativ!";
	else
		for(unsigned i=1; i < numNodes; i++)
			outStr << output[i] << ' ';
	outStr << '\n';

	return 0;
}