Pagini recente » Cod sursa (job #1085965) | Cod sursa (job #2539919) | Cod sursa (job #709767) | minune3 | Cod sursa (job #2037258)
#include <iostream>
#include <vector>
#include <list>
#include <queue>
#include <stdio.h>
#include <string.h>
#include <climits>
const int maxn = 50001;
const int inf = 1 << 30;
FILE *in = fopen("dijkstra.in","r"), *out = fopen("dijkstra.out","w");
using namespace std;
class Graph
{
public:
std::list<std::pair<int, int> >* neigh;
int n;
Graph(int n) {
this->n = n + 1;
neigh = new std::list<std::pair<int, int>> [n + 1];
}
void addEdge(int u, int v, int w) {
neigh[u].push_back(make_pair(v, w));
neigh[v].push_back(make_pair(u, w));
}
void shortestPath(int source) {
auto comparator = [](pair<int, int> p1, pair<int, int> p2) {
return p1.second < p2.second;
};
priority_queue<pair<int, int>, vector<pair<int, int>>, decltype(comparator)> pq (comparator);
vector<int> distance(n, INT_MAX -1);
vector<bool> visited(n, false);
distance[source] = 0;
visited[source] = true;
pq.push(make_pair(source, 0));
while(pq.size() != 0) {
auto node = pq.top();
pq.pop();
//std::cout << "Value: " << node.first << " " << node.second << "\n";
for (const auto& child : neigh[node.first]) {
//std::cout << "Getting to child: " << child.first << " " << child.second << " " << distance[child.first] << "\n";
if (distance[child.first] > distance[node.first] + child.second) {
distance[child.first] = distance[node.first] + child.second;
//std::cout << "Updating: " << child.first << " " << distance[child.first]<< "\n";
if (!visited[child.first]) {
visited[child.first] = true;
pq.push(make_pair(child.first, distance[child.first]));
}
}
}
}
for ( int i = 2; i < n; ++i)
fprintf(out, "%d ", distance[i] == INT_MAX -1 ? 0 : distance[i]);
fprintf(out, "\n");
}
};
int main()
{
int n, m;
fscanf(in, "%d %d", &n, &m);
Graph g(n);
int x, y, z;
for ( int i = 0; i < m; ++i )
{
fscanf(in, "%d %d %d", &x, &y, &z);
g.addEdge(x, y, z);
}
g.shortestPath(1);
return 0;
}