Pagini recente » Cod sursa (job #2740717) | Cod sursa (job #1172163) | Cod sursa (job #3133176) | Cod sursa (job #1063792) | Cod sursa (job #1904883)
#include <fstream>
#include <vector>
#include <queue>
#define NMax 100010
#define INF 1000000000
using namespace std;
ifstream f("dijkstra.in");
ofstream g("dijkstra.out");
int nodes, edges, dist[NMax], mark[NMax];
vector< pair<int, int> > G[NMax];
class less_functor {
public:
bool operator()(pair<int, int> p1, pair<int, int> p2) {
return p1.second > p2.second;
}
};
priority_queue < pair<int, int>, vector< pair<int, int> >, less_functor > H;
void dijkstra(int source)
{
for (int i = 1; i <= nodes; i++)
dist[i] = INF;
dist[source] = 0;
H.push(make_pair(source, 0));
while (!H.empty()) {
while (!H.empty() && mark[H.top().first] == true)
H.pop();
if (H.empty())
break;
pair<int, int> crtNode = H.top();
H.pop();
mark[crtNode.first] = true;
for (auto node : G[crtNode.first]) {
if (!mark[node.first] && dist[node.first] > dist[crtNode.first] + node.second) {
dist[node.first] = dist[crtNode.first] + node.second;
H.push(make_pair(node.first, dist[node.first]));
}
}
}
}
int main()
{
f >> nodes >> edges;
int n1, n2, c;
for (int i = 1; i <= edges; i++) {
f >> n1 >> n2 >> c;
G[n1].push_back(make_pair(n2, c));
}
dijkstra(1);
for (int i = 2; i <= nodes; i++) {
if (dist[i] != INF)
g << dist[i] << ' ';
else
g << 0 << ' ';
}
}