Cod sursa(job #2229768)

Utilizator TrixerAdrian Dinu Trixer Data 8 august 2018 05:38:01
Problema Algoritmul lui Dijkstra Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.15 kb
#include <iostream>
#include <fstream>
#include <list>
#include <queue>
#include <functional>
#include <algorithm>
#include <set>

#define NMAX 50001
#define INF  (1<<30)
#define SRC  1

using namespace std;

int n, m;
list<pair<int, int>> graph[NMAX];
int dist[NMAX];
priority_queue<int, vector<int>, function<bool(int, int)>> q(
	[](int a, int b) {
		return dist[a] < dist[b];
	}
);
set<int> visited;

void dijkstra()
{
	// initialization
	for (int i = 1; i <= n; i++) {
		if (i != SRC)
			dist[i] = INF;

		q.push(i);
	}

	// main loop
	while (!q.empty() && visited.size() < 1) {
		int a = q.top();
		q.pop();
		
		for (auto bc : graph[a]) {
			int alt = dist[a] + bc.second;
			if (alt < dist[bc.first]) {
				dist[bc.first] = alt;
				q.push(bc.first);
			}
		}
	}
}

int main()
{
	int a, b, c;

	// read input
	ifstream fin("dijkstra.in");

	fin >> n >> m;
	for (int i = 0; i < m; i++) {
		fin >> a >> b >> c;
		graph[a].push_back(make_pair(b, c));
	}

	fin.close();

	// solve
	dijkstra();
	
	// print output
	ofstream fout("dijkstra.out");

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

	fout.close();

	return 0;
}