Cod sursa(job #2036437)

Utilizator osiaccrCristian Osiac osiaccr Data 10 octombrie 2017 18:03:31
Problema Algoritmul lui Dijkstra Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.3 kb
//Algoritmul lui dijktra cu set

#include <fstream>
#include <vector>
#include <set>
#define DEF 50001
#define INF 50000000000

using namespace std;

ifstream fin ("dijkstra.in");
ofstream fout ("dijkstra.out");

int n, m;
long long d[DEF];

vector < pair <int, int> > L[DEF];
set < pair <int, int> > S;

int main () {
    fin >> n >> m;
    for (int i = 1; i <= m; i++) {
        int x, y, z;
        fin >> x >> y >> z;
        L[x].push_back (make_pair (y, z));
    }

    for (int i = 2; i <= n; i++) {
        d[i] = INF;
    }

    S.insert (make_pair (0, 1));
    while (!S.empty ()) {
        int nod = S.begin () -> second;
        S.erase (S.begin ());
        for (vector < pair <int, int> >::iterator it = L[nod].begin (); it != L[nod].end (); it++) {
            int vecin = it -> first,
                cost = it -> second;
            if (d[vecin] > d[nod] + cost) {
                if (d[vecin] != INF)
                    S.erase (S.find (make_pair (d[vecin], vecin)));
                d[vecin] = d[nod] + cost;
                S.insert (make_pair (d[vecin], vecin));
            }
        }
    }

    for (int i = 2; i <= n; i++) {
        if (d[i] == INF)
            fout << "0 ";
        else
            fout << d[i] << " ";
    }

    return 0;
}