Cod sursa(job #2110913)

Utilizator Tyler_BMNIon Robert Gabriel Tyler_BMN Data 21 ianuarie 2018 14:59:57
Problema Algoritmul lui Dijkstra Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.22 kb
#include <algorithm>
#include <fstream>
#include <cstring>
#include <vector>
#include <set>
using namespace std;

const int NMAX = 50005;
const int INF = 0x3f3f3f3f;

vector<pair<int, int>> G[NMAX];

int dist[NMAX];

int main() {
	ifstream fin("dijkstra.in");
	ofstream fout("dijkstra.out");

	int n, m;
	fin >> n >> m;

	for (int i = 0; i < m; ++i) {
		int from, to, cost;
		fin >> from >> to >> cost;
		G[from].push_back(make_pair(to, cost));
	}

	memset(dist, INF, sizeof dist);
	dist[1] = 0;
	set<pair<int, int>> heap;
	heap.insert(make_pair(0, 1));
	while (!heap.empty()) {
		int node = heap.begin()->second;
		int d = heap.begin()->first;
		heap.erase(heap.begin());

		for (vector<pair<int, int>>::iterator it = G[node].begin(); it != G[node].end(); ++it) {
			int to = it->first;
			int cost = it->second;
			if (dist[to] > dist[node] + cost) {
				if (dist[to] != INF) {
					heap.erase(heap.find(make_pair(dist[to], to)));
				}
				dist[to] = dist[node] + cost;
				heap.insert(make_pair(dist[to], to));
			}
		}
	}

	for (int i = 2; i <= n; ++i) {
		if (dist[i] == INF) {
			dist[i] = 0;
		}
		fout << dist[i] << ' ';
	}
	fout << '\n';

	fin.close();
	fout.close();
	return 0;
}