Cod sursa(job #2237742)

Utilizator gabrielxCojocaru Gabriel-Codrin gabrielx Data 2 septembrie 2018 22:07:12
Problema Algoritmul Bellman-Ford Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.89 kb
#include <fstream>
#include <vector>
#include <string>
#include <map>
#include <unordered_map>
#include <queue>
#include <deque>
#include <cmath>
#include <algorithm>
#include <set>

#define INF 1e17

using namespace std;

ifstream cin("bellmanford.in");
ofstream cout("bellmanford.out");

int n, m;
vector<vector<pair<int, int>>> v(50001);
vector<pair<pair<int, int>, int>> edges;

void bellmanford() {
	set<pair<int, int>> nodesToConsider;
	set<pair<int, int>> nodesToConsider2;
	vector<long long> distances(n + 1);

	fill(distances.begin(), distances.end(), INF);

	distances[1] = 0;
	nodesToConsider.insert(make_pair(distances[1], 1));

	for (int i = 0; i < n - 1; ++i) {
		nodesToConsider2.clear();

		for (auto nodeToConsider : nodesToConsider) {
			for (auto edge : v[nodeToConsider.second]) {
				if (distances[nodeToConsider.second] + edge.second < distances[edge.first]) {
					auto it = nodesToConsider2.find(make_pair(distances[edge.first], edge.first));
					if (it != nodesToConsider2.end()) {
						nodesToConsider2.erase(nodesToConsider2.find(make_pair(distances[edge.first], edge.first)));
					}

					distances[edge.first] = distances[nodeToConsider.second] + edge.second;
					nodesToConsider2.insert(make_pair(distances[edge.first], edge.first));
				}
			}
		}

		nodesToConsider = nodesToConsider2;
	}

	for (auto edge : edges) {
		if (distances[edge.first.first] + edge.second < distances[edge.first.second]) {
			cout << "Ciclu negativ!";
			return;
		}
	}

	for (int i = 2; i <= n; ++i) {
		cout << distances[i] << ' ';
	}
}

int main() {
	cin.sync_with_stdio(false);
	cout.sync_with_stdio(false);
	
	int v1, v2, cost;

	cin >> n >> m;

	for (int i = 0; i < m; ++i) {
		cin >> v1 >> v2 >> cost;
		v[v1].push_back(make_pair(v2, cost));
		edges.push_back(make_pair(make_pair(v1, v2), cost));
	}

	bellmanford();
	
	return 0;
}