Pagini recente » Cod sursa (job #302161) | Cod sursa (job #2637219) | Cod sursa (job #2550452) | Cod sursa (job #1359795) | Cod sursa (job #486835)
Cod sursa(job #486835)
#include <fstream>
#include <limits>
#include <set>
#include <vector>
#include <utility>
void mainSet()
{
std::ifstream in("dijkstra.in");
std::ofstream out("dijkstra.out");
std::vector<std::vector<unsigned short> > arcs, graph;
int nodeCount, arcCount;
in >> nodeCount >> arcCount;
graph.resize(arcCount);
arcs.resize(arcCount);
for (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 short> 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));
}
}
}
// Output the results.
for (int i = 2; i <= nodeCount; i++)
out << ((distances[i] == std::numeric_limits<unsigned short>::max()) ? 0 : distances[i]) << ' ';
}
int main()
{
mainSet();
}