Pagini recente » Cod sursa (job #3328490) | Cod sursa (job #698768) | Cod sursa (job #197147) | Cod sursa (job #77875) | Cod sursa (job #3355147)
#include <iostream>
#include <vector>
#include <queue>
#include <fstream>
using namespace std;
ifstream fin("distante.in");
ofstream fout("distante.out");
const int INF = 1e9;
void solve() {
int n, m, s;
fin >> n >> m >> s;
vector<int> D(n + 1);
for (int i = 1; i <= n; i++) {
fin >> D[i];
}
vector<vector<pair<int, int>>> adj(n + 1);
for (int i = 1; i <= m; i++) {
int x, y, c;
fin >> x >> y >> c;
adj[x].push_back({y, c});
}
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq;
vector<int> dist(n + 1, INF);
dist[s] = 0;
pq.push({dist[s], s});
while(!pq.empty()) {
int d = pq.top().first;
int node = pq.top().second;
pq.pop();
if (d > dist[node]) continue;
for (const auto& edge : adj[node]) {
int neigh = edge.first;
int c = edge.second;
if (dist[node] + c < dist[neigh]) {
dist[neigh] = dist[node] + c;
pq.push({dist[neigh], neigh});
}
}
}
for (int i = 1; i <= n; i++) {
if (D[i] != dist[i]) {
fout << "NU" << '\n';
return;
}
}
fout << "DA" << '\n';
}
int main() {
int t;
fin >> t;
while (t) {
t--;
solve();
}
return 0;
}