Pagini recente » Cod sursa (job #817898) | Cod sursa (job #196755) | Cod sursa (job #2833836) | Cod sursa (job #773612) | Cod sursa (job #1001396)
#include <cstdio>
#include <cstring>
#include <vector>
#include <queue>
#include <utility>
#define FILEIN "distante.in"
#define FILEOUT "distante.out"
using namespace std;
const int NMAX = 50005;
const int INF = 0x3f3f3f3f;
vector<int> C[NMAX]; // cost
vector<int> A[NMAX]; // adiacenta
queue<pair<int, int> > Q;
int N, M, S;
int D[NMAX];
int givenD[NMAX];
void dijkstra(int source) {
memset(D, INF, sizeof(D));
D[source] = 0;
Q.push(make_pair(source,0));
while (!Q.empty()) {
int d, x;
x = Q.front().first;
d = Q.front().second;
Q.pop();
for ( int i = 0; i < A[x].size(); i++) {
if ( d + C[x][i] < D[A[x][i]]) {
D[A[x][i]] = d + C[x][i];
Q.push(make_pair(A[x][i], D[A[x][i]]));
}
}
}
}
bool check(int N) {
int i;
for ( i = 1; i <= N; i++) {
if (D[i] != givenD[i])
return false;
}
return true;
}
int main()
{
freopen(FILEIN, "r", stdin);
freopen(FILEOUT, "w", stdout);
int T;
scanf("%d", &T);
while(T--) {
scanf("%d %d %d", &N, &M, &S);
for ( int i = 1; i <= N; i++) {
A[i].clear();
C[i].clear();
}
for ( int i = 1; i <= N; i++) {
scanf("%d", &givenD[i]);
}
for ( int i = 1, x, y, d; i <= M; i++) {
scanf("%d %d %d", &x, &y, &d);
A[x].push_back(y); C[x].push_back(d);
A[y].push_back(x); C[y].push_back(d);
}
dijkstra(S);
if(check(N))
printf("DA\n");
else
printf("NU\n");
}
return 0;
}