Pagini recente » Cod sursa (job #1628420) | Cod sursa (job #2503241) | Cod sursa (job #2737203) | Cod sursa (job #391965) | Cod sursa (job #3128322)
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
ifstream in("distante.in");
ofstream out("distante.out");
#define INF (1 << 30)
priority_queue <pair<int, int>, vector<pair<int, int> >, greater<pair<int, int> > > q;
int main(){
int T;
in >> T;
for(int i = 0; i < T; i++){
int N, M, S;
in >> N >> M >> S;
vector<int> initial_dist(N, -1);
for (int j = 0; j < N; j++)
in >> initial_dist[j];
vector<pair<int, int> > adj[M];
for (int j = 0; j < M; j++){
int x, y, w;
in >> x >> y >> w;
adj[x].push_back({y, w});
}
// Dijkstra and check if initial_dists are correct
vector<int> d(N + 1);
vector<int> p(N + 1);
d[S] = 0;
p[S] = -1;
while (!q.empty())
q.pop();
for (int i = 1; i <= N; i++) {
if (i != S) {
d[i] = INF;
p[i] = -1;
}
q.push({d[i], i});
}
while (!q.empty()){
int u = q.top().second;
q.pop();
for (auto& it : adj[u]) {
int v = it.first;
int w = it.second;
if (d[v] > d[u] + w) {
d[v] = d[u] + w;
p[v] = u;
q.push({d[v], v});
}
}
}
for (int i = 1; i <= N; i++) {
if (d[i] == INF) {
d[i] = -1;
}
}
bool ok = true;
for (int i = 0; i < N; i++){
if (initial_dist[i] != d[i + 1]){
ok = false;
break;
}
}
if (ok)
out << "DA\n";
else
out << "NU\n";
}
}