Pagini recente » Cod sursa (job #2337735) | Cod sursa (job #1677807) | Cod sursa (job #3164121) | Cod sursa (job #370670) | Cod sursa (job #2706244)
#include <cstdio>
#include <vector>
#include <queue>
using namespace std;
const long long INF = (int)6e9;
const int NMAX = (int)5e4;
vector<pair<int, int>> adj[NMAX+1];
int N, M, S;
long long dist[NMAX+1];
void dijkstra() {
bool processed[NMAX+1] = {};
for(int i=1;i<=N;i++) {
dist[i] = INF;
}
dist[S] = 0;
priority_queue<pair<long long,int>> q;
q.push({0, S});
while(!q.empty()) {
int v = q.top().second;
q.pop();
if(processed[v])
continue;
processed[v] = true;
for(auto i:adj[v]) {
int len = i.second, e = i.first;
if(!processed[e] && dist[v]+len < dist[e]) {
q.push({-dist[v]-len, e});
dist[e] = dist[v]+len;
}
}
}
}
void solve() {
scanf("%d %d %d", &N, &M, &S);
int d[N+1];
for(int i=1;i<=N;i++) {
scanf("%d", &d[i]);
adj[i] = {};
}
for(int i=1;i<=M;i++) {
int a, b, c;
scanf("%d %d %d", &a, &b, &c);
adj[a].push_back({b, c});
adj[b].push_back({a, c});
}
dijkstra();
bool ok = true;
for(int i=1;i<=N;i++) {
if(d[i] != dist[i])
ok = false;
}
if(ok)
printf("DA\n");
else
printf("NU\n");
}
int main() {
freopen("distante.in", "r", stdin);
freopen("distante.out", "w", stdout);
int T;
scanf("%d", &T);
for(int i=0;i<T;i++) {
solve();
}
return 0;
}