Cod sursa(job #2714240)

Utilizator teofilotopeniTeofil teofilotopeni Data 1 martie 2021 16:02:23
Problema Algoritmul lui Dijkstra Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.35 kb
#include <iostream>
#include <vector>
#include <bitset>
#include <queue>
using namespace std;

//  Algoritmul lui Dijkstra

struct Nod {
    int val;
    int lg;

    Nod(int value, int length) {
        val = value;
        lg = length;
    }
    bool operator <(const Nod& n) const {
        return n.lg < lg;
    }
};

int main() {
    freopen("dijkstra.in", "r", stdin);
    freopen("dijkstra.out", "w", stdout);
    int n, m, x, y, lg;
    scanf("%d %d", &n, &m);
    vector<vector<Nod>> noduri(n + 1);

    while (m--) {
        scanf("%d %d %d", &x, &y, &lg);
        noduri[x].push_back(Nod(y, lg));
        noduri[y].push_back(Nod(x, lg));
    }

    priority_queue<Nod> deParcurs;
    bitset<50010> parcurs;
    vector<int> minim(n + 1, 1000000010);
    deParcurs.push(Nod(1, 0));
    minim[1] = 0;

    while (deParcurs.size()) {
        Nod from = deParcurs.top();
        deParcurs.pop();

        for (int i = 0; i < noduri[from.val].size() && !parcurs[from.val]; i++) {
            Nod to = noduri[from.val][i];
            if (to.lg + from.lg < minim[to.val]) {
                minim[to.val] = from.lg + to.lg;
                deParcurs.push(Nod(to.val, to.lg + from.lg));
            }
        }
        parcurs[from.val] = 1;
    }
    for (x = 2; x <= n; x++)
        printf("%d ", minim[x]);
    return 0;
}