Pagini recente » Cod sursa (job #2366933) | Cod sursa (job #1353825) | Cod sursa (job #584815) | Cod sursa (job #1849738) | Cod sursa (job #1610200)
#include <iostream>
#include <cstdio>
#include <vector>
#include <queue>
#define inf 0x3f3f3f3f
#include <cstring>
using namespace std;
int n,m,s;
int vec[50005],dist[50005],t;
vector <pair <int ,int > > g[50005];
priority_queue<pair < int ,int > > q;
void dijkstra();
void citire()
{
for (int i=1;i<=n;++i)
g[i].clear();
scanf("%d%d%d",&n,&m,&s);
for (int i=1;i<=n;++i)
scanf("%d",&vec[i]);
for (int i=1;i<=m;++i)
{
int nod1,nod2,c;
scanf("%d%d%d",&nod1,&nod2,&c);
g[nod1].push_back(make_pair(nod2,c));
g[nod2].push_back(make_pair(nod1,c));
}
q.push(make_pair(0,s));
memset(dist,inf,sizeof(dist));
}
void dijkstra()
{
while (!q.empty())
{
int d=-q.top().first;
int nod=q.top().second;
q.pop();
for (vector <pair <int ,int > >:: iterator it=g[nod].begin();it!=g[nod].end();++it)
if (dist[it->first] > it->second+d)
{
dist[it->first]=it->second+d;
q.push(make_pair(-dist[it->first],it->first));
}
}
}
int solve()
{
citire();
dijkstra();
dist[1]=0;
for (int i=1;i<=n;++i)
if (vec[i]!=dist[i])
return 0;
return 1;
}
int main()
{
freopen("distante.in","r",stdin);
freopen("distante.out","w",stdout);
scanf("%d",&t);
for (int i=1;i<=t;++i)
{
if (solve())
printf("DA\n");
else
printf("NU\n");
}
return 0;
}