Cod sursa(job #1790418)

Utilizator preda.andreiPreda Andrei preda.andrei Data 28 octombrie 2016 11:06:28
Problema Algoritmul lui Dijkstra Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.38 kb
#include <fstream>
#include <queue>
#include <vector>

using namespace std;

typedef pair<int, int> Muchie;
typedef vector<vector<Muchie>> Graf;

const int kInfinit = (1 << 30);

inline bool Cmp(const Muchie &a, const Muchie &b)
{
    return a.second > b.second;
}

vector<int> Dijkstra(const Graf &g, int start)
{
    vector<int> distante(g.size(), kInfinit);
    distante[start] = 0;

    priority_queue<Muchie, vector<Muchie>, decltype(&Cmp)> coada(&Cmp);
    coada.push({start, 0});

    while (!coada.empty()) {
        int nod = coada.top().first;
        int cost = coada.top().second;
        coada.pop();

        for (auto &m : g[nod]) {
            int cost_final = cost + m.second;
            if (cost_final < distante[m.first]) {
                distante[m.first] = cost_final;
                coada.push({m.first, cost_final});
            }
        }
    }

    for (int &dist : distante)
        if (dist == kInfinit)
            dist = 0;
    return distante;
}

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

    int n, m;
    fin >> n >> m;

    Graf graf(n + 1);
    while (m--) {
        int x, y, c;
        fin >> x >> y >> c;
        graf[x].push_back({y, c});
    }

    auto distante = Dijkstra(graf, 1);
    for (int i = 2; i <= n; ++i)
        fout << distante[i] << " ";

    return 0;
}