Cod sursa(job #3296563)

Utilizator CristinaStingaCristina Stinga CristinaStinga Data 13 mai 2025 19:24:36
Problema Distante Scor 40
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.62 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <tuple>
#include <limits>

#define INF 100000

using namespace std;

void dijkstra(int N, int source, const vector<vector<pair<int, int>>>& adj, vector<int>& dist) {
    dist.assign(N + 1, INF);
    dist[source] = 0;
    
    priority_queue<pair<int, int>, vector<pair<int, int>>, greater<>> pq;
    pq.push({0, source});

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

        if (d > dist[u]) continue;

        for (const auto& [v, cost] : adj[u]) {
            if (dist[u] + cost < dist[v]) {
                dist[v] = dist[u] + cost;
                pq.push({dist[v], v});
            }
        }
    }
}

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<int> expected(N + 1);
        for (int i = 1; i <= N; ++i) {
            fin >> expected[i];
        }

        vector<vector<pair<int, int>>> adj(N + 1);

        for (int i = 0; i < M; ++i) {
            int a, b, c;
            fin >> a >> b >> c;
            adj[a].emplace_back(b, c);
            adj[b].emplace_back(a, c);
        }

        vector<int> real;
        dijkstra(N, S, adj, real);

        bool correct = true;
        for (int i = 1; i <= N; ++i) {
            if ((expected[i] == -1 && real[i] != INF) ||
                (expected[i] != -1 && real[i] != expected[i])) {
                correct = false;
                break;
            }
        }

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

    return 0;
}