Pagini recente » Cod sursa (job #1614273) | Cod sursa (job #515670) | Cod sursa (job #3240530) | Cod sursa (job #1638108) | Cod sursa (job #706183)
Cod sursa(job #706183)
#include<stdio.h>
#include<vector>
#include<queue>
using namespace std;
struct nod
{
long x;
long sum;
};
vector<nod> a[50001][10];
long s,ok,t,nr,x,y,c,n,m,i,vd[50001],dist[50001];
nod cod;
void rezolva(long t)
{
queue<long> q;
scanf("%ld %ld %ld",&n,&m,&s);
for(i=1;i<=n;i++) scanf("%ld",&vd[i]);
for(i=1;i<=m;i++)
{
scanf("%ld %ld %ld",&x,&y,&c);
cod.sum=c;
cod.x=y;
a[x][t].push_back(cod);
}
for(i=1;i<=n;i++) dist[i]=500000000;
dist[s]=0;
q.push(s);
while(!q.empty())
{
x=q.front();
nr=a[x][t].size();
for(i=0;i<nr;i++)
if(dist[a[x][t][i].x]>dist[x]+a[x][t][i].sum)
{
dist[a[x][t][i].x]=dist[x]+a[x][t][i].sum;
q.push(a[x][t][i].x);
}
q.pop();
}
ok=1;
for(i=1;i<=n;i++)
{
if(dist[i]==500000000) dist[i]=0;
if(dist[i]!=vd[i])
{
ok=0;
break;
}
}
if(ok==1) printf("DA\n");
else printf("NU\n");
}
int main()
{
freopen("distante.in","r",stdin);
freopen("distante.out","w",stdout);
scanf("%ld",&t);
for(t=t;t>=1;t--) rezolva(t);
return 0;
}