Cod sursa(job #2844108)

Utilizator CaptnBananaPetcu Tudor CaptnBanana Data 3 februarie 2022 19:36:39
Problema Algoritmul lui Dijkstra Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.64 kb
#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();
}