Pagini recente » Cod sursa (job #2011081) | Cod sursa (job #112388) | Cod sursa (job #1995173) | Cod sursa (job #119684) | Cod sursa (job #3354693)
#include <iostream>
#include <vector>
#include <queue>
#include <fstream>
using namespace std;
ifstream fin("distante.in");
ofstream fout("distante.out");
const int INF = 2e9 + 7;
void solve() {
int num_nodes, num_edges, source;
fin >> num_nodes >> num_edges >> source;
vector<int> bronzarel_dist(num_nodes + 1);
for (int i = 1; i <= num_nodes; i++)
fin >> bronzarel_dist[i];
vector<vector<pair<int, int>>> adj(num_nodes + 1);
for (int i = 0; i < num_edges; i++) {
int u, v, cost;
fin >> u >> v >> cost;
adj[u].push_back({v, cost});
adj[v].push_back({u, cost});
}
vector<int> real_dist(num_nodes + 1, INF);
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq;
real_dist[source] = 0;
pq.push({0, source});
while (!pq.empty()) {
int d = pq.top().first;
int u = pq.top().second;
pq.pop();
if (d > real_dist[u])
continue;
for (const auto& edge : adj[u]) {
int v = edge.first;
int cost = edge.second;
if (real_dist[u] + cost < real_dist[v]) {
real_dist[v] = real_dist[u] + cost;
pq.push({real_dist[v], v});
}
}
}
bool is_correct = true;
for (int i = 1; i <= num_nodes; i++) {
if (real_dist[i] != bronzarel_dist[i]) {
is_correct = false;
break;
}
}
if (is_correct)
fout << "DA\n";
else
fout << "NU\n";
}
int main() {
int test_cases;
if (fin >> test_cases)
while (test_cases--)
solve();
return 0;
}