Pagini recente » Cod sursa (job #968836) | Cod sursa (job #2700918) | Cod sursa (job #2320747) | Borderou de evaluare (job #1567605) | Cod sursa (job #1926832)
#include <iostream>
#include <cstdio>
#include <vector>
#include <queue>
#include <algorithm>
#define MAXN 50005
#define INF 0x3f3f3f3f
using namespace std;
int T, N, M, S;
int D[MAXN], d[MAXN];
vector<pair<int,int> >graf[MAXN];
void init()
{
fill(d,d+MAXN,INF);
for(int i=1;i<MAXN;i++)
{
graf[i].clear();
}
}
void citire()
{
scanf("%d %d %d",&N,&M,&S);
for(int i=1;i<=N;i++)
{
scanf("%d ",&D[i]);
}
for(int i=1;i<=M;i++)
{
int a, b, c;
scanf("%d %d %d",&a,&b,&c);
graf[a].push_back(make_pair(b,c));
graf[b].push_back(make_pair(a,c));
}
}
void dijkstra()
{
d[S] = 0;
queue<int>coada;
coada.push(S);
while(!coada.empty())
{
int nod = coada.front();
coada.pop();
for(auto &it : graf[nod])
{
if(d[it.first] > d[nod] + it.second)
{
d[it.first] = d[nod] + it.second;
coada.push(it.first);
}
}
}
}
void compara()
{
bool ok = true;
for(int i=1;i<=N && ok;i++)
{
if(D[i]!=d[i])
ok = false;
}
if(ok)
printf("DA\n");
else printf("NU\n");
}
int main()
{
freopen("distante.in","r",stdin);
freopen("distante.out","w",stdout);
scanf("%d",&T);
for(int t=0;t<T;t++)
{
init();
citire();
dijkstra();
compara();
}
return 0;
}