Pagini recente » Cod sursa (job #3356904) | Cod sursa (job #3349211) | Cod sursa (job #889135) | Cod sursa (job #3308229) | Cod sursa (job #3355091)
#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;
}