Pagini recente » Cod sursa (job #410221) | Cod sursa (job #2766611) | Cod sursa (job #1843790) | Cod sursa (job #344885) | Cod sursa (job #3355493)
#include <fstream>
#include <vector>
#include <queue>
#include <climits>
using namespace std;
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<long long> dat(n + 1);
for (int i = 1; i <= n; i++) {
fin >> dat[i];
}
vector<vector<pair<int, int>>> gr(n + 1);
for (int i = 0; i < m; i++) {
int a, b, c;
fin >> a >> b >> c;
gr[a].push_back({b, c});
gr[b].push_back({a, c});
}
const long long INF = LLONG_MAX / 4;
vector<long long> dist(n + 1, INF);
priority_queue<
pair<long long, int>,
vector<pair<long long, int>>,
greater<pair<long long, int>>
> pq;
dist[s] = 0;
pq.push({0, s});
while (!pq.empty()) {
auto [d, x] = pq.top();
pq.pop();
if (d != dist[x]) continue;
for (auto [y, cost] : gr[x]) {
if (dist[x] + cost < dist[y]) {
dist[y] = dist[x] + cost;
pq.push({dist[y], y});
}
}
}
bool ok = true;
for (int i = 1; i <= n; i++) {
if (dist[i] != dat[i]) {
ok = false;
break;
}
}
fout << (ok ? "DA" : "NU") << '\n';
}
return 0;
}