Pagini recente » Cod sursa (job #1144100) | Cod sursa (job #462556) | Cod sursa (job #3355096)
#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;
}