Pagini recente » Cod sursa (job #3284859) | Cod sursa (job #772067) | Cod sursa (job #2923042) | Cod sursa (job #685535) | Cod sursa (job #976265)
Cod sursa(job #976265)
#include<cstdio>
#include<vector>
#define NMAX 50000
#define oo 1<<30
using namespace std;
void read();
int solve();
int T,N,M,S,a,b,c,i;
int D[NMAX];
vector<pair<int,int> > V[NMAX];
vector<pair<int,int> >::iterator it;
int main()
{
freopen("distante.in","r",stdin);
freopen("distante.out","w",stdout);
scanf("%d",&T);
for(;T;--T)
{
read();
if(solve()==0) printf("NU\n");
else printf("DA\n");
}
return 0;
}
void read()
{
scanf("%d%d%d",&N,&M,&S);
for(i=1;i<=N;i++)
{
scanf("%d",&D[i]);
V[i].resize(0);
}
for(;M;--M)
{
scanf("%d%d%d",&a,&b,&c);
V[a].push_back(make_pair(b,c));
V[b].push_back(make_pair(a,c));
}
}
int solve()
{
if(D[S]!=0) {return 0;}
for(a=1;a<=N;a++)
{
if(a!=S) b=0;
else b=1;
for(it=V[a].begin();it!=V[a].end();it++)
{
if(D[it->first]+it->second<D[a] || D[a]+it->second<D[it->first]) {return 0;}
if(D[it->first]+it->second==D[a]) b=1;
}
if(b==0) {return 0;}
}
return 1;
}