Pagini recente » Profil Bagherah | Cod sursa (job #708944) | Cod sursa (job #96525) | Cod sursa (job #238053) | Cod sursa (job #883312)
Cod sursa(job #883312)
#include<cstdio>
#include<vector>
#include<deque>
#include<bitset>
#include<utility>
#define nmax 50010
#define oo 1<<30
using namespace std;
vector<pair<int,int> >v[nmax];
vector<pair<int,int> >::iterator it;
deque<int>Q;
bitset<nmax>M;
int n,m,s,t,ok,OK,x,y,c,d[nmax],dd[nmax],i;
int main()
{
freopen("distante.in","r",stdin);
freopen("distante.out","w",stdout);
scanf("%d ", &t);
for(;t;--t)
{
if(ok)
for(i=1;i<=n;i++)
v[i].resize(0);
scanf("%d%d%d", &n, &m, &s);
ok=1;OK=1;
for(i=1;i<=n;i++){scanf("%d ", &dd[i]);d[i]=oo;M[i]=0;}
d[s]=0;M[s]=1;Q.push_back(s);
for(;m;--m)
{
scanf("%d%d%d", &x, &y, &c);
v[x].push_back(make_pair(y,c));
v[y].push_back(make_pair(x,c));
}
if(dd[s]){printf("NU\n");continue;}
for(;Q.size();)
{
x=Q.front();
for(it=v[x].begin();it!=v[x].end();it++)
if(d[it->first]>d[x]+it->second)
{
d[it->first]=d[x]+it->second;
if(!M[it->first])
{
M[it->first]=1;
Q.push_back(it->first);
}
}
M[x]=0;
Q.pop_front();
}
for(i=1;i<=n;i++)
if(d[i]!=dd[i]){printf("NU\n");OK=0;break;}
if(OK)printf("DA\n");
}
return 0;
}