Cod sursa(job #2970189)

Utilizator mihaistamatescuMihai Stamatescu mihaistamatescu Data 24 ianuarie 2023 14:45:06
Problema Distante Scor 40
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.39 kb
#include <fstream>
#include <vector>
#include <set>

constexpr int INF = 2e9;
constexpr int maxN = 5e4 + 10;

using namespace std;

struct muc {
    int vec, cost;
};

int inD[maxN], d[maxN];
vector<muc> L[maxN];
set<pair<int, int> > s;

int main() {
    ifstream fin("distante.in");
    ofstream fout("distante.out");
    int t, n, m, st, x, y, c;
    for (fin >> t; t--;) {
        fin >> n >> m >> st;
        for (int i = 1; i <= n; i++) {
            fin >> inD[i];
        }
        for (int i = 1; i <= m; i++) {
            fin >> x >> y >> c;
            L[x].push_back({y, c});
            L[y].push_back({x, c});
        }
        for (int i = 1; i <= n; i++) {
            d[i] = INF;
        }
        d[st] = 0;
        s.insert({d[st], st});
        while (!s.empty()) {
            int crt = s.begin()->second;
            s.erase(s.begin());
            for (auto muc: L[crt]) {
                if (d[muc.vec] > d[crt] + muc.cost) {
                    s.erase(make_pair(d[muc.vec], muc.vec));
                    d[muc.vec] = d[crt] + muc.cost;
                    s.insert(make_pair(d[muc.vec], muc.vec));
                }
            }
        }
        bool ok = true;
        for (int i = 1; i <= n; i++) {
            L[i].clear();
            if (inD[i] != d[i]) {
                ok = false;
                break;
            }
        }
        fout << (ok ? "DA\n" : "NU\n");
    }
    return 0;
}