Cod sursa(job #2828587)

Utilizator truscalucaLuca Trusca truscaluca Data 7 ianuarie 2022 17:15:45
Problema Distante Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.04 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <set>
#include <queue>

using namespace std;

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

vector<vector<pair<int, int>>> listaAd;
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<>> minHeap;
int inputDists[nMax], dists[nMax], nrGrafuri, n, m, s;

void dijkstra(int start) {
    // Declara
    fill(dists, dists + n + 1, INF);

    // 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.push({0, start});

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

        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) {
                // Actualizam distanta lui y si il punem la procesat
                dists[y] = dists[x] + c;
                minHeap.push({dists[y], y});
            }
        }
    }
}


int main() {
    ifstream in("distante.in");
    ofstream out("distante.out");

    // Input rapid
    ios_base::sync_with_stdio(false);
    in.tie(nullptr);

    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";
        }
    }

    in.close();

    return 0;
}