Pagini recente » Cod sursa (job #1810782) | Istoria paginii runda/255157 | Cod sursa (job #780636) | Cod sursa (job #1360022) | Cod sursa (job #250503)
Cod sursa(job #250503)
#include<stdio.h>
#include<vector>
#define lg 50100
#define INF 0x3f3f3f3f
using namespace std;
typedef pair<int,int> graf;
vector <graf> nr[lg];
int C[lg],cost[lg],coada[10*lg],cnt[lg],apar[lg];
int rasp(int n){
int i;
for(i=1;i<=n;++i){
if(C[i]!=cost[i])
return 0;
}
return 1;
}
void solve(){
int n,m,s,i,st,dr,a,b,c;
scanf("%d%d%d",&n,&m,&s);
for(i=1;i<=n;++i)
scanf("%d",&C[i]);
for(i=0;i<m;++i){
scanf("%d%d%d",&a,&b,&c);
++cnt[a];
++cnt[b];
nr[a].push_back(graf(b,c));
nr[b].push_back(graf(a,c));
}
for(i=1;i<=n;++i)
cost[i]=INF;
coada[0]=s;
st=dr=0;
cost[s]=0;
while(st<=dr){
a=coada[st];
for(i=0;i<cnt[a];++i){
b=nr[a][i].first;
c=nr[a][i].second;
if(c+cost[a]<cost[b]){
cost[b]=c+cost[a];
if(!apar[b])
coada[++dr]=b, apar[b]=1;
}
}
++st;
apar[a]=0;
}
if(rasp(n))
printf("DA\n");
else
printf("NU\n");
for(i=1;i<=n;++i){
nr[i].clear();
cnt[i]=0;
}
}
int main(){
freopen("distante.in","r",stdin);
freopen("distante.out","w",stdout);
int t;
scanf("%d",&t);
for(;t;--t)
solve();
fclose(stdin);
fclose(stdout);
return 0;
}