Pagini recente » Cod sursa (job #18721) | Cod sursa (job #1322429) | Cod sursa (job #836959) | Cod sursa (job #533658) | Cod sursa (job #2844108)
#include <bits/stdc++.h>
using namespace std;
ifstream f("dijkstra.in");
ofstream g("dijkstra.out");
const int N = 5e4 + 1, INF32 = 0x3f3f3f3f;
int n, m, x, y, w, poz[N], d[N], h, heap[2 * N];
vector<pair<int, int>> c[N];
void coboara(int p){
int bun = p;
if(2 * p <= n && d[heap[2 * p]] < d[heap[bun]])
bun = 2 * p;
if(2 * p + 1 <= n && d[heap[2 * p + 1]] < d[heap[bun]])
bun = 2 * p + 1;
if(bun != p){
swap(poz[heap[p]], poz[heap[bun]]);
swap(heap[p], heap[bun]);
coboara(bun);
}
}
void urca(int p){
while(p > 0 && d[heap[p]] < d[heap[p / 2]]){
swap(poz[heap[p]], poz[heap[p / 2]]);
swap(heap[p], heap[p / 2]);
p /= 2;
}
}
void sterge(int p){
poz[heap[p]] = 0;
heap[p] = heap[h--];
coboara(p);
}
void dijkstra(int start){
for(int i = 1; i <= n; i++)
d[i] = INF32;
d[start] = 0;
heap[++h] = start;
poz[h] = start;
while(h){
int x = heap[1];
sterge(1);
for(auto e: c[x]){
int y = e.first, w = e.second;
if(d[x] + w < d[y]){
d[y] = d[x] + w;
if(poz[y] == 0){
heap[++h] = y;
poz[y] = h;
}
urca(poz[y]);
}
}
}
}
int main(){
f >> n >> m;
for(int i = 0; i < m; i++){
f >> x >> y >> w;
c[x].push_back({y, w});
c[y].push_back({x, w});
}
f.close();
dijkstra(1);
for(int i = 2; i <= n; i++)
g << d[i] << ' ';
g.close();
}