Cod sursa(job #2828580)

Utilizator truscalucaLuca Trusca truscaluca Data 7 ianuarie 2022 17:05:09
Problema Distante Scor 60
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.45 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <set>

using namespace std;

const int nMax = 50005;
const int INF = 1 << 30;

vector<vector<pair<int, int>>> listaAd;
set<pair<int, int>> minHeap; // "min".. doar e un ordered set (crescator)
int inputDists[nMax], dists[nMax], nrGrafuri, n, m, s;

void dijkstra(int start) {
    // Declara
    fill(dists, dists + n + 1, INF);
    minHeap.clear();
    
    // Incepem algoritmul din nodul de start
    dists[start] = 0;
    // Punem in set perechea {0, [nod start]}, 0 fiind distanta de la start pana la el insusi
    minHeap.insert({0, start});

    while (!minHeap.empty()) {
        // Procesam nodul de la distanta cea mai mica fata de start
        auto x = minHeap.begin()->second;
        minHeap.erase(minHeap.begin());

        for (auto &e: listaAd[x]) {
            auto y = e.first, c = e.second;

            // Obtinem un drum mai scurt (fata de cel gasit) daca trecem prin x
            if (dists[y] > dists[x] + c) {
                // Nodul y e deja marcat ca trebuind sa fie procesat => il scoatem din set, ca sa il readaugam
                // cu noua distanta, mai mica (ca sa nu pierdem timp incercand sa-l optimizam cu distanta veche
                // mai tarziu) -- 90p->100p
                if (minHeap.count({dists[y], y}) > 0) {
                    minHeap.erase(minHeap.find({dists[y], y}));
                }

                // Actualizam distanta lui y si il punem la procesat
                dists[y] = dists[x] + c;
                minHeap.insert({dists[y], y});
            }
        }
    }
}


int main() {
    // Input rapid
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);

    ifstream in("distante.in");
    ofstream out("distante.out");

    in >> nrGrafuri;
    for (int k = 1; k <= nrGrafuri; k++) {
        // Input
        in >> n >> m >> s;
        for (int i = 1; i <= n; i++) {
            in >> inputDists[i];
        }
        listaAd.clear();
        listaAd.resize(n + 1);
        for (int i = 1; i <= m; i++) {
            int x, y, c;
            in >> x >> y >> c;
            listaAd[x].push_back({y, c});
            listaAd[y].push_back({x, c});
        }

        dijkstra(s);

        int ok = 1;
        for (int i = 1; i <= n; i++) {
            if (inputDists[i] != dists[i]) {
                ok = 0;
                break;
            }
        }
        if (ok) {
            out << "DA\n";
        } else {
            out << "NU\n";
        }
    }
    return 0;
}