Pagini recente » Cod sursa (job #2084750) | Cod sursa (job #1838847) | Cod sursa (job #1019039) | Cod sursa (job #1755541) | Cod sursa (job #1130085)
#include <cstdio>
#include <vector>
#include <queue>
#define Nmax 50005
#define INF 0x3f3f3f3f / 2
using namespace std;
int T, N, M, S, Cost[Nmax], Test[Nmax];
vector <pair <int, int> > G[Nmax];
priority_queue <pair <int, int>, vector <pair <int, int> >, greater <pair <int, int> > > Q;
void Citire()
{
int a, b, c;
scanf("%d %d %d", &N, &M, &S);
for (int i = 1; i <= N; ++i)
{
G[i].clear();
scanf("%d", &Test[i]);
Cost[i] = INF;
}
for (int i = 1; i <= M; ++i)
{
scanf("%d %d %d", &a, &b, &c);
G[a].push_back(make_pair(c, b));
G[b].push_back(make_pair(c, a));
}
}
void Dijkstra(int start)
{
int nod;
vector <pair <int, int> > :: iterator it;
Q.push(make_pair(0, start));
Cost[start] = 0;
while (!Q.empty())
{
nod = Q.top().second;
Q.pop();
for (it = G[nod].begin(); it != G[nod].end(); ++it)
{
if (Cost[it -> second] > Cost[nod] + it -> first)
{
Cost[it -> second] = Cost[nod] + it -> first;
Q.push(make_pair(Cost[it -> second], it -> second));
}
}
}
}
void Verificare()
{
int ok = 1;
for (int i = 1; i <= N; ++i)
if (Test[i] != Cost[i])
{
ok = 0;
break;
}
if (ok)
printf("DA\n");
else
printf("NU");
}
int main()
{
freopen("distante.in", "r", stdin);
freopen("distante.out", "w", stdout);
scanf("%d", &T);
for (int i = 1; i <= T; ++i)
{
Citire();
Dijkstra(S);
Verificare();
}
return 0;
}