Pagini recente » Borderou de evaluare (job #1549463) | Cod sursa (job #85307) | Monitorul de evaluare | Borderou de evaluare (job #1993160) | Cod sursa (job #3354652)
#include <bits/stdc++.h>
using namespace std;
int main() {
ifstream f("distante.in");
ofstream g("distante.out");
int t;
f >> t;
while (t--) {
int n, m, src;
f >> n >> m >> src;
vector<long long> initial(n + 1);
for (int i = 1; i <= n; i++) f >> initial[i];
vector<vector<pair<int,int>>> adj(n + 1);
for (int i = 0; i < m; i++) {
int x, y, c;
f >> x >> y >> c;
adj[x].push_back({y, c});
adj[y].push_back({x, c});
}
const long long INF = 1e18;
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[src] = 0;
pq.push({0, src});
while (!pq.empty()) {
auto [d, u] = pq.top();
pq.pop();
if (d != dist[u]) continue;
for (auto [v, c] : adj[u]) {
if (dist[u] + c < dist[v]) {
dist[v] = dist[u] + c;
pq.push({dist[v], v});
}
}
}
bool ok = true;
for (int i = 1; i <= n; i++) {
if (dist[i] != initial[i]) {
ok = false;
break;
}
}
g << (ok ? "DA\n" : "NU\n");
}
return 0;
}