Pagini recente » Diferente pentru admin/task-ratings-guidelines intre reviziile 40 si 31 | Cod sursa (job #2907136) | Cod sursa (job #2053530) | Cod sursa (job #2634871) | Cod sursa (job #3323972)
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <climits>
using namespace std;
vector<int> dijkstra(const vector<vector<pair<int, int>>> &adj, int start) {
vector<int> dist(adj.size(), INT_MAX);
dist[start] = 0;
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq;
pq.emplace(0, start);
while (!pq.empty())
{
auto top = pq.top();
pq.pop();
int d = top.first;
int u = top.second;
if (d != dist[u]) continue;
for (auto &neighbor : adj[u])
{
int node = neighbor.first;
int cost = neighbor.second;
if (dist[node] > dist[u] + cost)
{
dist[node] = dist[u] + cost;
pq.emplace(dist[node], node);
}
}
}
return dist;
}
int main() {
int n, m;
ifstream in("dijkstra.in");
ofstream out("dijkstra.out");
in >> n >> m;
vector<vector<pair<int, int>>> adj(n + 1);
for (int i = 0; i < m; ++i) {
int u, v, w;
in >> u >> v >> w;
adj[u].emplace_back(v, w);
}
vector<int> dist = dijkstra(adj, 1);
for (int i = 2; i <= n; ++i) {
if (dist[i] == INT_MAX) {
out << 0 << ' ';
} else {
out << dist[i] << ' ';
}
}
return 0;
}