Pagini recente » Cod sursa (job #198290) | Cod sursa (job #1673661) | Cod sursa (job #881461) | Cod sursa (job #3279091) | Cod sursa (job #2828132)
#include <iostream>
#include <vector>
#include <queue>
#include <climits>
std::vector<int>
distante_minime_dijkstra(const int src, const int n,
const std::vector<std::vector<std::pair<int, int>>>& adj)
{
std::vector<char> visited(n + 1, false);
std::vector<int> distance(n + 1, INT_MAX);
distance[src] = 0;
std::priority_queue<std::pair<int, int>, std::vector<std::pair<int, int>>,
std::greater<std::pair<int, int>>>
q;
q.push({0, src});
while(!q.empty())
{
const int a = q.top().second;
q.pop();
if(visited[a])
{
continue;
}
visited[a] = true;
for(auto& e : adj[a])
{
const int b = e.first;
const int w = e.second;
if(distance[a] + w < distance[b])
{
distance[b] = distance[a] + w;
q.push({distance[b], b});
}
}
}
return distance;
}
void solve_one()
{
int N, M, S;
std::cin >> N >> M >> S;
std::vector<int> d_orig(N + 1);
for(int i = 1; i <= N; ++i)
{
std::cin >> d_orig[i];
}
d_orig[0] = INT_MAX;
std::vector<std::vector<std::pair<int, int>>> adj(N + 1);
for(int i = 0; i < M; ++i)
{
int a, b, w;
std::cin >> a >> b >> w;
adj[a].push_back({b, w});
adj[b].push_back({a, w});
}
static constexpr const char* ans[] = {"NU\n", "DA\n"};
std::cout << ans[d_orig == distante_minime_dijkstra(S, N, adj)];
}
int main()
{
std::freopen("distante.in", "r", stdin);
std::freopen("distante.out", "w", stdout);
std::ios_base::sync_with_stdio(false);
std::cin.tie(nullptr);
int T;
std::cin >> T;
for(int t = 0; t < T; ++t)
{
solve_one();
}
}