Pagini recente » Cod sursa (job #977629) | Cod sursa (job #2753172) | Cod sursa (job #2220441) | Cod sursa (job #1835400) | Cod sursa (job #773477)
Cod sursa(job #773477)
#include <stdio.h>
#include <vector>
#include <limits.h>
#define inf INT_MAX
using namespace std;
int q[100001], d[50001], a[50001];
vector<int> g1[50001], g2[50001];
int n, m, i, j, T, start, c, x, y;
int st, dr, p;
int main() {
freopen("distante.in", "r", stdin);
freopen("distante.out", "w", stdout);
scanf("%d", &T);
while(T) {
scanf("%d %d %d", &n, &m, &start);
for(i = 1; i <= n; i++) {
scanf("%d", &a[i]);
d[i] = inf;
g1[i].clear();
g2[i].clear();
g1[i].push_back(0);
g2[i].push_back(0);
}
for(i = 1; i <= m; i++) {
scanf("%d %d %d", &x, &y, &c);
g1[x].push_back(y);
g1[y].push_back(x);
g2[x].push_back(c);
g2[y].push_back(c);
}
d[start] = 0;
q[1] = start;
st = dr = 1;
while(st <= dr) {
p = q[st++];
for(i = 1; i < g1[p].size(); i++)
if(d[g1[p][i]] > d[p] + g2[p][i]) {
d[g1[p][i]] = d[p] + g2[p][i];
q[++dr] = g1[p][i];
}
}
int sem = 1;
i = 0;
while(sem && i < n) {
++i;
if(a[i] != d[i])
sem = 0;
}
if(sem)
printf("DA\n");
else
printf("NU\n");
T--;
}
return 0;
}