Pagini recente » Cod sursa (job #332408) | Cod sursa (job #1850551) | Cod sursa (job #3195834) | Cod sursa (job #881588) | Cod sursa (job #881822)
Cod sursa(job #881822)
#include<cstdio>
#include<cassert>
#include<cstring>
#include<vector>
#include<algorithm>
#include<queue>
#define pb push_back
#define mp make_pair
#define f first
#define s second
using namespace std;
int n, m, s, vals[50005], vis[50005];
vector<pair<int, int> > graph[50005];
void read(){
memset(vals, 0, sizeof(vals));
memset(vis, 0, sizeof(vis));
scanf("%d%d%d", &n, &m, &s);
for(int i = 1; i <= n; ++i)
graph[i].clear();
for(int i = 1; i <= n; ++i)
scanf("%d", &vals[i]);
for(int i = 1; i <= m; ++i){
int x, y, c;
scanf("%d%d%d", &x, &y, &c);
graph[x].pb(mp(y, c));
graph[y].pb(mp(x, c));
}
}
int ans;
void solve(){
ans = 1;
queue<int> q;
if(vals[s]){
ans = 0;
return ;
}
q.push(s);
vis[s] = 1;
while(!q.empty()){
int now = q.front();
q.pop();
for(int i = 0; i < graph[now].size(); ++i){
int node = graph[now][i].f;
int edg = graph[now][i].s;
if(vals[node] == vals[now] + edg && !vis[node]){
vis[node] = 1;
q.push(node);
}
else if(vals[node] > vals[now] && vals[now] + edg < vals[node]){
ans = 0;
return;
}
}
}
for(int i = 1; i <= n; ++i)
if(!vis[i])
ans = 0;
}
void write(){
if(ans == 1)
printf("DA\n");
else
printf("NU\n");
}
int main(){
assert(freopen("distante.in", "r", stdin));
assert(freopen("distante.out", "w", stdout));
int cases;
scanf("%d", &cases);
for(int i = 1; i <= cases; ++i){
read();
solve();
write();
}
return 0;
}