Cod sursa(job #3355096)

Utilizator dariadrdariaa dariadr Data 21 mai 2026 19:00:13
Problema Distante Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.32 kb
#include <iostream>
#include <vector>
#include <algorithm>
#include <fstream>

using namespace std;
ifstream fin("distante.in");
ofstream fout("distante.out");

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

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

    vector<Edge> edges(M);
    for (int i = 0; i < M; ++i) {
        fin >> 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;
    fin >> T;
    while (T--) {
        if (solve()) 
            fout << "DA" << endl;
        else 
            fout << "NU" << endl;
    }
    return 0;
}