Pagini recente » Cod sursa (job #514312) | Cod sursa (job #1446080) | Cod sursa (job #1268498) | Cod sursa (job #2838821) | Cod sursa (job #1367318)
#include <cstdio>
# define nmax 50002
# define mmax 100002
# define inf 20000000
using namespace std;
int n,m,t,s;
struct muchie {int x,y,c;};
muchie G[mmax];
int D[nmax],Dr[nmax];
int main()
{freopen("distante.in", "rt", stdin);
freopen("distante.out", "wt", stdout);
scanf("%d",&t);
int i,ok;
while(t)
{for(i=1;i<=n;++i) D[i]=0;
ok=0;
scanf("%d",&n);
scanf("%d",&m);
scanf("%d",&s);
for(i=1;i<=n;++i) scanf("%d",&Dr[i]);
for(i=1;i<=m;++i)
{
scanf("%d",&G[i].x);
scanf("%d",&G[i].y);
scanf("%d",&G[i].c);
if(G[i].x==s) D[G[i].y]=G[i].c;
}
for(i=1;i<=n;++i)
{
if(D[i]==0 && i!=s) D[i]=inf;
}
while(ok==0)
{
ok=1;
for(i=1;i<=m;++i)
{
if(D[G[i].y]>D[G[i].x]+G[i].c)
{
D[G[i].y]=D[G[i].x]+G[i].c;
ok=0;
}
if(D[G[i].x]>D[G[i].y]+G[i].c)
{
D[G[i].x]=D[G[i].y]+G[i].c;
ok=0;
}
}
}
ok=0;
for(i=1;i<=n;++i)
if(D[i]!=Dr[i]) {ok=1 ; i=n+1;}
if(ok==0) printf("DA\n");
else printf("NU\n");
--t;
}
return 0;
}