Pagini recente » Cod sursa (job #734569) | Cod sursa (job #1124085) | Cod sursa (job #1776933) | Cod sursa (job #2164792) | Cod sursa (job #707969)
Cod sursa(job #707969)
#include<cstdio>
#include<vector>
#include <utility>
#include <queue>
#define maxn 50001
using namespace std;
vector < pair<long, long> > A[maxn];
queue <long> q;
long T, N, M, C[maxn], D[maxn];
long i, j, x, y, d, Start;
bool ok;
void golire() {
for (i = 1; i <= N; ++i)
A[i].clear();
}
void dijkstra(long Start) {
long i, elc, G[maxn];
for (i = 1; i <= N; ++i) {
G[i] = A[i].size();
}
for (i = 1; i <= N; ++i)
C[i] = 250000002;
C[Start] = 0;
q.push(Start);
for (; !q.empty(); q.pop()) {
elc = q.front();
for (i = 0; i < G[elc]; ++i) {
if ( C[elc] + A[elc][i].second < C[A[elc][i].first] ) {
C[ A[elc][i].first ] = C[elc] + A[elc][i].second;
q.push(A[elc][i].first);
}
}
}
}
int main() {
freopen("distante.in","r",stdin);
freopen("distante.out","w",stdout);
for (scanf("%ld", &T); T; --T) {
golire();
scanf("%ld %ld %ld", &N, &M, &Start);
for (i = 1; i <= N; ++i)
scanf("%ld", &D[i]);
for (i = 1; i <= M; ++i) {
scanf("%ld %ld %ld", &x, &y, &d);
A[x].push_back( make_pair(y, d) );
A[y].push_back( make_pair(x, d) );
}
dijkstra(Start);
ok = true;
for (i = 1; i <= N; ++i) {
if (C[i] == 250000002 && D[i] != 0) {
ok = false;
break;
} else if (C[i] != D[i]) {
ok = false;
break;
}
}
if (ok == true) {
printf("DA\n");
} else {
printf("NU\n");
}
}
return 0;
}