Pagini recente » Cod sursa (job #1345819) | Cod sursa (job #1911643) | Cod sursa (job #880545) | Cod sursa (job #2362924) | Cod sursa (job #1248549)
#include <cstdio>
#include <vector>
#include <stack>
#include <cstring>
#define N 50005
using namespace std;
void loop()
{
int n,m,sursa,i,a,b,c,cost[N],viz[N];
vector<pair<int,int> > g[N];
vector<pair<int,int> >::iterator it;
stack<int> s;
scanf("%d%d%d",&n,&m,&sursa);
for(i=1;i<=n;++i)
scanf("%d",&cost[i]);
for(i=1;i<=m;++i)
{
scanf("%d%d%d",&a,&b,&c);
g[a].push_back(make_pair(b,c));
g[b].push_back(make_pair(a,c));
}
memset(viz,0,sizeof(viz));
viz[sursa]=1;
for(it=g[sursa].begin();it!=g[sursa].end();++it)
if(!viz[it->first])
{
s.push(it->first);
viz[it->first]=1;
}
while(!s.empty())
{
a=s.top();
s.pop();
for(it=g[a].begin();it!=g[a].end();++it)
if(!viz[it->first])
{
s.push(it->first);
viz[it->first]=1;
}
int ok=0;
for(it=g[a].begin();it!=g[a].end();++it)
{
if(cost[a]>cost[it->first]+it->second)
{
printf("NU\n");
return;
}
else if(cost[a]==cost[it->first]+it->second)
ok=1;
}
if(!ok)
printf("NU\n");
}
printf("DA\n");
}
int main()
{
freopen("distante.in","r",stdin);
freopen("distante.out","w",stdout);
int T;
scanf("%d",&T);
while(T--)
loop();
return 0;
}