Cod sursa(job #515592)

Utilizator feelshiftFeelshift feelshift Data 21 decembrie 2010 19:08:43
Problema Algoritmul lui Dijkstra Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.67 kb
// http://infoarena.ro/problema/dijkstra
#include <iostream>
#include <fstream>
#include <utility>
#include <vector>
#include <list>
#include <queue>
using namespace std;

#define INFINITY 0x3f3f3f3f
#define cost first
#define location second
int nodes,edges;

vector< list< pair<int,int> > > graph;
vector<int> dist;
priority_queue< pair<int,int>, vector< pair<int,int> >, greater< pair<int,int> > > myHeap;	// wtf?!?

void read();
void dijkstra(int startNode);
void write();

int main() {
	read();
	dijkstra(1);
	write();

	return (0);
}

void read() {
	ifstream in("dijkstra.in");
	int from,to,cost;

	in >> nodes >> edges;
	graph.resize(nodes+1);
	dist.resize(nodes+1);

	for(int i=1;i<=edges;i++) {
		in >> from >> to >> cost;

		graph.at(from).push_back(make_pair(cost,to));
	}

	in .close();
}

void dijkstra(int startNode) {
	myHeap.push(make_pair(0,startNode));
	dist.assign(nodes+1,INFINITY);
	dist.at(startNode) = 0;

	pair<int,int> currentNode;
	list< pair<int,int> >::iterator neighbour;
	
	while(!myHeap.empty()) {
		currentNode = myHeap.top();
		myHeap.pop();

		for(neighbour=graph.at(currentNode.location).begin();
			neighbour!=graph.at(currentNode.location).end();
			neighbour++)
			if(dist.at(currentNode.location) + neighbour->cost < dist.at(neighbour->location)) {
				dist.at(neighbour->location) = dist.at(currentNode.location) + neighbour->cost;
				myHeap.push(make_pair(dist.at(neighbour->location),neighbour->location));
			}
	}

}

void write() {
	ofstream out("dijkstra.out");

	for(int i=2;i<=nodes;i++)
		if(dist.at(i) != INFINITY)
			out << dist.at(i) << " ";
		else
			out << "0 ";

	out.close();
}