Pagini recente » Cod sursa (job #2141288) | Cod sursa (job #606737) | Cod sursa (job #3145115) | Cod sursa (job #2315560) | Cod sursa (job #1692719)
#include<cstdio>
#include<vector>
#include<queue>
using namespace std;
vector<int> v[50001],vc[50001];
struct eu{int x,y;};
eu nod;
priority_queue<pair<int,int > > pq;
int n,m,i,j,k,x,y,val,vec[50001],t,qq,vc1[50001];
int main ()
{
freopen("distante.in","r",stdin);
freopen("distante.out","w",stdout);
scanf("%d",&t);
for(qq=1;qq<=t;qq++)
{
int sursa;
scanf("%d%d%d",&n,&m,&sursa);
for(i=1;i<=n;i++)
scanf("%d",&vc1[i]);
for(i=1;i<=n;i++)
vec[i]=1000000000;
for(i=1;i<=m;i++)
{
scanf("%d%d%d",&x,&y,&val);
v[x].push_back(y);
vc[x].push_back(val);
}
vec[sursa]=0;
pq.push(make_pair(0,sursa));
while(!pq.empty())
{
int pp=0;
if(-pq.top().first==vec[pq.top().second])
{
pp=1;
nod.x=vec[pq.top().second];
nod.y=pq.top().second;
pq.pop();
for(i=0;i<v[nod.y].size();i++)
if(vec[v[nod.y][i]]>nod.x+vc[nod.y][i])
{
vec[v[nod.y][i]]=nod.x+vc[nod.y][i];
pq.push(make_pair(-vec[v[nod.y][i]],v[nod.y][i]));
}
}
if(pp==0)
pq.pop();
}
int pp=0;
for(i=1;i<=n;i++)
{
if(vec[i]!=1000000000)
if(vec[i]!=vc1[i])
{
pp=1;
break;
}
}
if(pp==0)
printf("DA\n");
else
printf("NU\n");
}
return 0;
}