Pagini recente » Cod sursa (job #1154881) | Cod sursa (job #1256572) | Cod sursa (job #1916159) | Cod sursa (job #2560153) | Cod sursa (job #2971648)
#include <fstream>
#include <vector>
#include <utility>
#include <set>
using namespace std;
ifstream fin("distante.in");
ofstream fout("distante.out");
const int DIM = 50010;
const int INF = 2000000000;
int d[DIM], dist[DIM];
vector<pair<int, int>> l[DIM];
void dijkstra(int start) {
set<pair<int, int>> s;
for (auto& elem : dist)
elem = INF;
dist[start] = 0;
s.insert(make_pair(0, start));
while (!s.empty()) {
int node = s.begin()->second;
s.erase(s.begin());
for (auto adjElem : l[node]) {
int adjNode = adjElem.first;
int cost = adjElem.second;
if (dist[adjNode] > dist[node] + cost) {
s.erase(make_pair(dist[adjNode], adjNode));
dist[adjNode] = dist[node] + cost;
s.insert(make_pair(dist[adjNode], adjNode));
}
}
}
}
int main() {
int t;
fin >> t;
while (t--) {
int n, m, s;
fin >> n >> m >> s;
for (int i = 1; i <= n; i++)
fin >> d[i];
for (int i = 1; i <= m; i++) {
int x, y, c;
fin >> x >> y >> c;
l[x].push_back(make_pair(y, c));
l[y].push_back(make_pair(x, c));
}
dijkstra(s);
bool ok = true;
for (int i = 1; i <= n && ok; i++)
if (d[i] != dist[i])
ok = false;
fout << (ok ? "DA" : "NU") << '\n';
}
return 0;
}