Cod sursa(job #3155144)

Utilizator AlexandruBenescuAlexandru Benescu AlexandruBenescu Data 7 octombrie 2023 14:13:43
Problema Distante Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.28 kb
#include <bits/stdc++.h>
#define L 50005
#define INF 1000000001
using namespace std;
ifstream fin("distante.in");
ofstream fout("distante.out");

int t;
int n, m, s;
int distMin[L], dist[L];
vector <pair <int, int>> G[L];

void init() {
  for (int i = 0; i <= n; i++)
    G[i].clear();
}

void dijkstra() {
  priority_queue <pair <int, int>> pq;

  for (int i = 1; i <= n; i++)
    dist[i] = INF;
  dist[s] = 0;
  pq.push({-dist[s], s});

  while (!pq.empty()) {
    int cost = - pq.top().first;
    int node = pq.top().second;
    pq.pop();
    if (dist[node] != cost)
      continue;
    for (auto it : G[node])
      if (dist[it.first] > cost + it.second) {
        dist[it.first] = cost + it.second;
        pq.push({-dist[it.first], it.first});
      }
  }
}

void solve() {
  fin >> n >> m >> s;
  init();

  for (int i = 1; i <= n; i++)
    fin >> distMin[i];
  for (int i = 1; i <= m; i++) {
    int a, b, c;
    fin >> a >> b >> c;
    G[a].push_back({b, c});
    G[b].push_back({a, c});
  }

  dijkstra();

  bool ans = true;
  for (int i = 1; i <= n; i++)
    if (distMin[i] != dist[i])
      ans = false;
  if (ans)
    fout << "DA\n";
  else
    fout << "NU\n";
}

int main() {
  for (fin >> t; t; t--)
    solve();
  return 0;
}