Cod sursa(job #1290327)

Utilizator FlameingoAiordachioaei Marius Flameingo Data 11 decembrie 2014 09:31:51
Problema Algoritmul lui Dijkstra Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.32 kb
#include <cstdio>
#include <queue>
#include <bitset>
#include <algorithm>
#define son first
#define cost second
using namespace std;

typedef pair <int, int> graph_node;
const int NMAX = 50002, INFI = 2e9;

int dist[NMAX], N;

struct predicate {

	inline bool operator () (const graph_node &a, const graph_node &b) {

		return b.cost < a.cost;

	}

};

vector <graph_node> G[NMAX];
priority_queue <graph_node, vector <graph_node>, predicate> Q;

void dijkstra (const int &start_node) {

	int node, cst, i;
	for (i = 1; i <= N; ++i)
		dist[i] = INFI;
	dist[start_node] = 0;
	Q.push (make_pair (start_node, 0));
	while (!Q.empty ()) {
		node = Q.top ().son;
		cst = Q.top ().cost;
		Q.pop ();
		if (dist[node] != cst)
			continue;
		for (vector <graph_node> :: iterator i = G[node].begin (); i != G[node].end (); ++i)
			if (i->cost + dist[node] < dist[i->son])  {
				dist[i->son] = i->cost + dist[node];
				Q.push (make_pair (i->son, dist[i->son]));
			}

	}
	for (i = 2; i <= N; ++i)
		printf ("%d ", dist[i] == INFI ? 0 : dist[i]);

}

int main () {

	freopen ("dijkstra.in", "r", stdin);
	freopen ("dijkstra.out" , "w", stdout);
	int M, a, b, c;
	scanf ("%d%d", &N, &M);
	while (M--) {
        scanf ("%d%d%d", &a, &b, &c);
        G[a].push_back (make_pair (b, c));
	}
	dijkstra (1);

}