Pagini recente » Cod sursa (job #2384933) | Cod sursa (job #251072) | Cod sursa (job #2374344) | Cod sursa (job #1453339) | Cod sursa (job #1735737)
#include <cstdio>
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
const int nmx = 50002;
const int inf = 0x3f3f3f3f;
int n,m,start;
int cost[nmx],dist[nmx];
vector <pair<int,int> > g[nmx];
void reset()
{
for(int i = 1; i < nmx; ++i)
{
g[i].clear();
dist[i] = inf;
}
}
void citire()
{
scanf("%d %d %d", &n, &m, &start);
for(int i = 1; i <= n; ++i)
scanf("%d", &cost[i]);
for(int i = 1; i <= m; ++i)
{
static int nod1,nod2,cost;
scanf("%d %d %d", &nod1, &nod2, &cost);
g[nod1].push_back(make_pair(nod2,cost));
g[nod2].push_back(make_pair(nod1,cost));
}
}
void calc_dist()
{
priority_queue <pair<int,int> > q;
q.push(make_pair(0,start));
dist[start] = 0;
while(not q.empty())
{
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] > dist[nod] + it->second)
{
dist[it->first] = dist[nod] + it->second;
q.push(make_pair(-dist[it->first],it->first));
}
}
}
void afish()
{
bool okay = true;
for(int i = 1; i <= n && okay; ++i)
if(dist[i] != cost[i])
okay = false;
if(okay)
printf("DA\n");
else
printf("NU\n");
}
int main()
{
freopen("distante.in", "r", stdin);
freopen("distante.out", "w", stdout);
int total;
scanf("%d", &total);
for(int i = 1; i <= total; ++i)
{
reset();
citire();
calc_dist();
afish();
}
return 0;
}