Pagini recente » Cod sursa (job #2749413) | Cod sursa (job #2747414) | Cod sursa (job #1426542) | Cod sursa (job #2519835) | Cod sursa (job #3237651)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("distante.in");
ofstream fout("distante.out");
int main() {
int t;
fin >> t;
while (t--) {
int n, m, s;
fin >> n >> m >> s;
vector<int> dist(n + 1);
for (int i = 1; i <= n; ++i) {
fin >> dist[i];
}
vector<pair<int, int>> graph[n + 1];
for (int i = 0; i < m; ++i) {
int a, b, c;
fin >> a >> b >> c;
graph[a].push_back({b, c});
graph[b].push_back({a, c});
}
vector<int> d(n + 1, INT_MAX);
d[s] = 0;
set<pair<int, int>> distSet;
distSet.insert({0, s});
while (!distSet.empty()) {
auto current = *distSet.begin();
distSet.erase(distSet.begin());
int currentNode = current.second;
for (auto edge : graph[currentNode]) {
int node = edge.first, cost = edge.second;
if (d[node] > d[currentNode] + cost) {
if (d[node] != INT_MAX) {
distSet.erase(distSet.find({d[node], node}));
}
d[node] = d[currentNode] + cost;
distSet.insert({d[node], node});
}
}
}
bool found = false;
for (int i = 1; i <= n; ++i) {
if (d[i] != dist[i]) {
fout << "NU\n";
found = true;
break;
}
}
if (!found) {
fout << "DA\n";
}
}
return 0;
}