Pagini recente » Monitorul de evaluare | Monitorul de evaluare | Monitorul de evaluare | Monitorul de evaluare | Cod sursa (job #3364855)
#include<bits/stdc++.h>
using namespace std;
const int NMAX = 5e5 + 10;
vector<pair<int, int> > adj[NMAX];
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int> > > hp;
int result[NMAX];
void expand(int current_node) {
for (auto [vecin, cost] : adj[current_node]) {
//printf("%d %d %d %d %d\n",current_node, result[current_node], vecin, result[vecin], cost);
if (cost + result[current_node] < result[vecin]) {
result[vecin] = cost + result[current_node];
hp.push({result[vecin], vecin});
}
}
}
void dijkstra(int starting_node, int n) {
for (int i = 1; i <= n; i++) result[i] = INT_MAX;
result[starting_node] = 0;
hp.push({0, starting_node});
while (!hp.empty()) {
pair<int, int> current_pair = hp.top();
hp.pop();
if (result[current_pair.second] != current_pair.first) continue;
expand(current_pair.second);
}
}
int main() {
freopen("dijkstra.in", "r", stdin);
freopen("dijkstra.out", "w", stdout);
int n, m; scanf("%d %d", &n, &m);
for (; m > 0; m--) {
int x, y, cost; scanf("%d %d %d", &x, &y, &cost);
adj[x].push_back({y, cost});
}
dijkstra(1, n);
for (int i = 2; i <= n; i++)
printf("%d ", result[i] == INT_MAX ? 0 : result[i]);
return 0;
}