Pagini recente » Cod sursa (job #1492186) | Cod sursa (job #59678) | Cod sursa (job #1533907) | Cod sursa (job #1039479) | Cod sursa (job #2021209)
# include <bits/stdc++.h>
# define per pair <int, int>
using namespace std;
const int inf = INT_MAX, Nmax = 5 * 1e5 + 5;
int T, i, n, m, father, x, y, z, Distance[Nmax], query[Nmax];
vector < pair <int, int> > G[Nmax];
void dijkstra (int father)
{
priority_queue < per, vector < per >, greater < per > > pq;
int cost, node;
for (i = 1; i <= n; Distance[i] = inf, ++i);
Distance[father] = 0, pq.push({0, father});
while (pq.size())
{
per current = pq.top();
cost = current.first, node = current.second, pq.pop();
if (cost != Distance[node]) continue;
for (auto &it: G[node])
{
if (it.second + cost >= Distance[it.first]) continue;
Distance[it.first] = it.second + cost;
pq.push({Distance[it.first], it.first});
}
}
}
int main ()
{
freopen("distante.in", "r", stdin);
freopen("distante.out", "w", stdout);
scanf("%d\n", &T);
for (; T; --T)
{
scanf("%d %d %d\n", &n, &m, &father);
for (i = 1; i <= n; ++i)
scanf("%d ", &query[i]);
for (i = 1; i <= m; ++i)
{
scanf("%d %d %d\n", &x, &y, &z);
G[x].push_back({y, z});
}
dijkstra(father);
bool ans = true;
for (i = 1; i <= n; ++i)
if (Distance[i] != query[i])
{
ans = false;
break;
}
if (ans) printf("DA\n");
else printf("NU\n");
}
return 0;
}