Cod sursa(job #3355091)

Utilizator dariadrdariaa dariadr Data 21 mai 2026 18:55:40
Problema Distante Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.12 kb
#include <iostream>
#include <vector>

using namespace std;

struct Edge {
    int u, v, c;
};

bool solve() {
    int N, M, S;
    cin >> N >> M >> S;
    vector<long long> D(N + 1);
    for (int i = 1; i <= N; ++i) cin >> D[i];

    vector<Edge> edges(M);
    for (int i = 0; i < M; ++i) {
        cin >> edges[i].u >> edges[i].v >> edges[i].c;
    }

    if (D[S] != 0) return false;

    // Verificăm inegalitatea triunghiului
    for (const auto& e : edges) {
        if (D[e.v] > D[e.u] + e.c || D[e.u] > D[e.v] + e.c) return false;
    }

    // Verificăm dacă fiecare distanță este justificată
    vector<bool> justificat(N + 1, false);
    justificat[S] = true;
    for (const auto& e : edges) {
        if (D[e.v] == D[e.u] + e.c) justificat[e.v] = true;
        if (D[e.u] == D[e.v] + e.c) justificat[e.u] = true;
    }

    for (int i = 1; i <= N; ++i) {
        if (!justificat[i]) return false;
    }

    return true;
}

int main() {
    int T;
    cin >> T;
    while (T--) {
        if (solve()) cout << "DA" << endl;
        else cout << "NU" << endl;
    }
    return 0;
}