Cod sursa(job #2536062)

Utilizator CosminMorarMorar Cosmin Andrei CosminMorar Data 1 februarie 2020 14:21:34
Problema Algoritmul lui Dijkstra Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.36 kb
#include <iostream>
#include <fstream>
#include <set>
#include <vector>
#include <cstring>
using namespace std;
ifstream fin("dijkstra.in");
ofstream fout("dijkstra.out");
#define INF 0x7f7f7f7f
int n, m;
vector<pair<int, int> > nod[50010];
set<pair<int, int> > s;
int dist[50010];

void readAndSet() {
    fin >> n >> m;
    for (int i = 1; i <= m; i++) {
        int a, b, cost;
        fin >> a >> b >> cost;
        nod[a].push_back(make_pair(b, cost));
    }
}

void dijkstra() {
    memset(dist, INF, sizeof dist);
    s.insert(make_pair(1, 0));

    while (!s.empty()) {
        int from = s.begin()->first;
        int actCost = s.begin()->second;
        s.erase(s.begin());

        for (pair<int, int> way : nod[from]) {
            int to = way.first;
            int newCost = actCost + way.second;

            if (newCost < dist[to]) {
                if (s.find(make_pair(to, dist[to])) != s.end())
                    s.erase(s.find(make_pair(to, dist[to])));
                s.insert(make_pair(to, newCost));
                dist[to] = newCost;
            }
        }
    }
}

void printDist() {
    for (int i = 2; i <= n; i++)
        if (dist[i] == INF)
            fout << 0;
        else
            fout << dist[i] << ' ';
}

int main() {
    readAndSet();
    dijkstra();
    printDist();
    return 0;
}