Pagini recente » Cod sursa (job #440834) | Monitorul de evaluare | Cod sursa (job #174217) | Cod sursa (job #2316674) | Cod sursa (job #2741418)
#include <iostream>
#include <cstring>
#include <fstream>
#include <vector>
using namespace std;
ifstream fin("dijkstra.in");
ofstream fout("dijkstra.out");
#define infi (1<<30)
#define f first
#define s second
vector <pair<int, int>> heap;
vector <pair<int, int>> v[50002];
int n, m, i, x, y, dp[50002], z, viz[50002], p;
void down_heap() {
unsigned k = 0, min_poz = 0;
heap[0] = heap[heap.size() - 1];
heap.pop_back();
while (2 * k + 2 <= heap.size ()) {
if (heap[2*k+1].s < heap[min_poz].s){
min_poz = 2*k+1;
}
if (2*k+2 <= heap.size()-1 && heap[2*k+2].s < heap[min_poz].s) {
min_poz = 2*k+2;
}
if(min_poz == k){
break;
}
swap(heap[k], heap[min_poz]);
k = min_poz;
}
}
void up_heap() {
int k = heap.size() - 1;
while (k > 0 && heap[k].s < heap[(k-1) / 2].s) {
swap(heap[k], heap[(k-1) / 2]);
k = (k-1) / 2;
}
}
void DIJ(){
int nc;
heap.push_back({1,0});
while(heap.size() > 0){
nc = heap[0].f;
down_heap();
if(viz[nc] == 0){
viz[nc] = 1;
for (auto x : v[nc]) {
if (dp[nc] + x.s < dp[x.f]) {
dp[x.f] = dp[nc] + x.s;
heap.push_back({x.f, dp[nc] + x.s});
up_heap();
}
}
}
}
}
int main()
{
fin>>n>>m;
for(i = 1; i <= m; i++){
fin>>x>>y>>z;
v[x].push_back({y, z});
}
for (i = 2; i <= n; i++)
dp[i] = infi;
DIJ();
for(i = 2; i <= n; i++){
if ( dp[i] == infi )
fout<<0<< ' ';
else
fout<<dp[i]<<' ';
}
return 0;
}