Pagini recente » Cod sursa (job #3291697) | Cod sursa (job #1291604) | Cod sursa (job #717335) | Cod sursa (job #2691778) | Cod sursa (job #3259384)
#include <bits/stdc++.h>
using namespace std;
int t, n, m, s;
vector<vector<pair<int, int>>> v(50001);
int cost[50001];
int dist[50001];
class comp {
public:
bool operator()(int x, int y) {
return cost[x] > cost[y];
}
};
bool dijkstra(int head) {
memset(cost, 0x3f, sizeof(cost));
priority_queue<int, vector<int>, comp> q;
q.push(head);
cost[head] = 0;
while (!q.empty()) {
int node = q.top();
q.pop();
for (int i = 0; i < v[node].size(); ++i) {
if (cost[node] + v[node][i].second < cost[v[node][i].first]) {
cost[v[node][i].first] = cost[node] + v[node][i].second;
q.push(v[node][i].first);
}
}
}
for (int i = 1; i <= n; ++i) {
if (cost[i] != dist[i]) {
return false;
}
}
return true;
}
int main() {
ifstream cin("distante.in");
ofstream cout("distante.out");
cin >> t;
while (t--) {
cin >> n >> m >> s;
for (int i = 1; i <= n; ++i) {
cin >> dist[i];
}
v.clear();
for (int i = 1; i <= m; ++i) {
int a, b, c;
cin >> a >> b >> c;
v[a].push_back({b, c});
v[b].push_back({a, c});
}
if (dijkstra(s)) {
cout << "DA\n";
} else {
cout << "NU\n";
}
}
}