Cod sursa(job #3355493)

Utilizator teo_elena1234Cretoiu Teodora-Elena teo_elena1234 Data 22 mai 2026 22:05:04
Problema Distante Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.54 kb
#include <fstream>
#include <vector>
#include <queue>
#include <climits>
using namespace std;

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

    int T;
    fin >> T;

    while (T--) {
        int n, m, s;
        fin >> n >> m >> s;

        vector<long long> dat(n + 1);
        for (int i = 1; i <= n; i++) {
            fin >> dat[i];
        }
        vector<vector<pair<int, int>>> gr(n + 1);

        for (int i = 0; i < m; i++) {
            int a, b, c;
            fin >> a >> b >> c;

            gr[a].push_back({b, c});
            gr[b].push_back({a, c});
        }

        const long long INF = LLONG_MAX / 4;
        vector<long long> dist(n + 1, INF);

        priority_queue<
            pair<long long, int>,
            vector<pair<long long, int>>,
            greater<pair<long long, int>>
        > pq;

        dist[s] = 0;
        pq.push({0, s});

        while (!pq.empty()) {
            auto [d, x] = pq.top();
            pq.pop();

            if (d != dist[x]) continue;

            for (auto [y, cost] : gr[x]) {
                if (dist[x] + cost < dist[y]) {
                    dist[y] = dist[x] + cost;
                    pq.push({dist[y], y});
                }
            }
        }

        bool ok = true;

        for (int i = 1; i <= n; i++) {
            if (dist[i] != dat[i]) {
                ok = false;
                break;
            }
        }

        fout << (ok ? "DA" : "NU") << '\n';
    }

    return 0;
}