Cod sursa(job #486839)

Utilizator iconiKMircea Chirea iconiK Data 22 septembrie 2010 21:21:58
Problema Algoritmul lui Dijkstra Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.49 kb
#include <fstream>
#include <limits>
#include <set>
#include <vector>
#include <utility>

void mainSet()
{
	std::ifstream in("dijkstra.in");
	
	unsigned int nodeCount, arcCount;
	in >> nodeCount >> arcCount;

	std::vector<std::vector<unsigned short> > arcs(arcCount), graph(arcCount);

	for (unsigned int i = 1; i <= arcCount; i++)
	{
		unsigned short sourceNode, targetNode, arcLength;
		in >> sourceNode >> targetNode >> arcLength;

		graph.at(sourceNode).push_back(targetNode);
		arcs.at(sourceNode).push_back(arcLength);
	}

	std::vector<unsigned int> distances(nodeCount + 1, std::numeric_limits<unsigned short>::max());
	std::set<std::pair<unsigned short, unsigned short> > targets;
	targets.insert(std::make_pair(0, 1));

	while (targets.size() > 0)
	{
		unsigned short origDist = (*targets.begin()).first;
		unsigned short origNode = (*targets.begin()).second;

		targets.erase(targets.begin());

		for (unsigned short i = 0; i < static_cast<unsigned short>(graph.at(origNode).size()); i++)
		{
			unsigned int arc = arcs[origNode][i];
			unsigned int node = graph[origNode][i];

			if (distances[node] > origDist + arc)
			{
				distances[node] = origDist + arc;
				
				targets.insert(std::make_pair(distances[node], node));
			}
		}
	}

	std::ofstream out("dijkstra.out");

	for (unsigned int i = 2; i <= nodeCount; i++)
		out << ((distances[i] == std::numeric_limits<unsigned short>::max()) ? 0 : distances[i]) << ' ';
}


int main()
{
	mainSet();
}