Pagini recente » Cod sursa (job #2834393) | Cod sursa (job #2589685) | Cod sursa (job #2597742) | Cod sursa (job #2733695) | Cod sursa (job #2966701)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("distante.in");
ofstream fout("distante.out");
int t, n, m, s;
long long dist_real[50004];
long long dist[50004];
vector<pair<int, int>> adj[50004];
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> Q;
void dijkstra()
{
dist_real[s] = 0;
Q.push({0, s});
while (!Q.empty())
{
int v = Q.top().second;
int d_v = Q.top().first;
Q.pop();
if (d_v != dist_real[v])
{
continue;
}
for (auto edge : adj[v])
{
int u = edge.first;
int cost = edge.second;
if (dist_real[v] + cost < dist_real[u])
{
dist_real[u] = dist_real[v] + cost;
Q.push({dist_real[u], u});
}
}
}
}
void solve()
{
fin >> n >> m >> s;
for (int i = 1; i <= n; i++)
{
fin >> dist[i];
}
for (int i = 1; i <= n; i++)
{
dist_real[i] = INT_MAX;
}
for (int i = 1; i <= n; i++)
{
adj[i].clear();
}
for (int i = 1; i <= m; i++)
{
int a, b, d;
fin >> a >> b >> d;
adj[a].push_back({b, d});
adj[b].push_back({a, d});
}
dijkstra();
bool ok = true;
for (int i = 1; i <= n; i++)
{
if (dist[i] != dist_real[i])
{
ok = false;
break;
}
}
ok ? fout << "DA\n" : fout << "NU\n";
}
int main()
{
fin >> t;
while (t--)
{
solve();
}
return 0;
}