Pagini recente » Cod sursa (job #1834527) | Cod sursa (job #3170405) | Cod sursa (job #2607677) | Cod sursa (job #1644900) | Cod sursa (job #2285960)
#include <bits/stdc++.h>
using namespace std;
ifstream in("distante.in");
ofstream out("distante.out");
#define N 50001
#define f first
#define s second
#define ll long long
ll M=LLONG_MAX;
ll n,m,S,t;
ll b[4*N], c[N], r[N],nr=0, r2[N];
pair<ll, ll> a[4*N];
pair<ll, ll> h[4*N];
bool v[N];
bool dij(){
ll i,j,cur,k=1;
while(h[0].f!=-M){
i=h[0].s;
cur=-h[0].f;
h[0].f=-M;
pop_heap(h,h+k);
if(!v[i]){
v[i]=1;
if(r[i]!=cur)
return 0;
r2[i]=cur;
j=c[i];
while(j){
if(!v[a[j].s]){
h[k].s=a[j].s;
h[k++].f=-(cur+a[j].f);
push_heap(h,h+k);
}
j=b[j];
}
}
}
return 1;
}
void add(ll x, ll y, ll z){
a[++nr].s=y;
a[nr].f=z;
b[nr]=c[x];
c[x]=nr;
}
int main(){
ll i,j,x,y,z;
bool bol=1;
in>>t;
while(t--){
nr=0;
in>>n>>m>>S;
for(i=1; i<=n; ++i)
in>>r[i];
for(i=1; i<=m; ++i){
in>>x>>y>>z;
add(x,y,z);
add(y,x,z);
}
h[0].s=S;
if(dij()){
bol=0;
for(i=1; i<=n && !bol; ++i)
if(r[i]!=r2[i])
bol=1;
if(!bol) out<<"DA\n";
else out<<"NU\n";
}
else out<<"NU\n";
memset(a, 0, 4*N);
memset(h, 0, 4*N);
memset(b, 0, 4*N);
memset(c, 0, N);
memset(r, 0, N);
memset(r2, 0, N);
memset(v, 0, N);
}
return 0;
}