Cod sursa(job #1065330)

Utilizator danny794Dan Danaila danny794 Data 23 decembrie 2013 10:27:38
Problema Algoritmul lui Dijkstra Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.18 kb
#include <cstdio>
#include <vector>
#include <queue>
#include <algorithm>

#define pii pair<int, int>
#define MAXN 50005
const int inf = 1 << 30;

using namespace std;

priority_queue <pii, vector<pii>, greater<pii> > Q;
vector <pii> d[MAXN];
int dist[MAXN];
int N, M;

void read() {
	freopen("dijkstra.in","r",stdin);
	freopen("dijkstra.out","w",stdout);
	scanf("%d %d", &N, &M);

	int from, to, cost;

	for(int i = 0; i < M; i++) {
		scanf("%d %d %d", &from, &to, &cost);
		d[from].push_back(make_pair(cost, to));
	}
}

void inline init() {
	dist[1] = 0;
	for(int i = 2; i <= N; i++)
		dist[i] = inf;
}

void solve() {
	Q.push(make_pair(dist[1], 1));

	while(!Q.empty()) {
		int cost = Q.top().first;
		int index = Q.top().second;
		Q.pop();

		if (cost > dist[index])
			continue;

		for(int i = 0; i < (int)d[index].size(); i++) {
			if (d[index][i].first + cost < dist[d[index][i].second]) {
				dist[d[index][i].second] = d[index][i].first + cost;
				Q.push(make_pair(dist[d[index][i].second], d[index][i].second));
			}
		}

	}
}

void inline print() {
	for(int i = 2; i <= N; i++)
		printf("%d ", dist[i] == inf ? 0 : dist[i]);
}

int main(){

	read();
	init();
	solve();
	print();

	return 0;
}