Cod sursa(job #1222523)

Utilizator roxana.istratePoenaru Roxana roxana.istrate Data 23 august 2014 15:12:31
Problema Algoritmul lui Dijkstra Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.47 kb
#include <iostream>
#include <vector>
#include <algorithm>
#include <utility>
#include <queue>

using namespace std;

int n, m, u, v, w;

vector< pair<int, int> > edges[250005];	 // < v, cost>
vector < pair<int, int> > dist; // <nod, dist>
vector < int > so_far_dist;

struct comp{
	bool operator()(const pair<int, int>& a, const pair<int, int>& b) const{
		return a.second > b.second;
	}
};


void dijkstra(){
	while (dist.size()){
		pair<int, int> p;
		pop_heap(dist.begin(), dist.end()); p = dist.back(); dist.pop_back();
		for (int i = 0; i < edges[p.first].size(); i++){
			int x = edges[p.first][i].first;
			if (p.second + edges[p.first][i].second < so_far_dist[x]){
				so_far_dist[x] = p.second + edges[p.first][i].second;
				dist.push_back(make_pair(x, so_far_dist[x]));
				push_heap(dist.begin(), dist.end()); 
			}
		}
	}
}

int main(){
	freopen("dijkstra.in", "r", stdin);
	freopen("dijkstra.out", "w", stdout);
	scanf("%d%d", &n, &m);
	//cin >> n >> m;
	dist.push_back(make_pair(0, 0)), so_far_dist.push_back(0);
	for (int i = 1; i < n; i++)
		so_far_dist.push_back(1 << 30);

	std::make_heap(dist.begin(), dist.end(), comp());
	
	for (int i = 0; i < m; i++){
		//cin >> u >> v >> w;
		scanf("%d%d%d", &u, &v, &w);
		u--, v--;
		edges[u].push_back(make_pair(v, w));
	}
	dijkstra();
	for (int i = 1; i < n; i++)
	if (so_far_dist[i] == (1 << 30)) cout << 0 << " "; else cout << so_far_dist[i] << " ";

	cout << "\n";
	
	return 0;
}