Cod sursa(job #2103556)

Utilizator andreigasparoviciAndrei Gasparovici andreigasparovici Data 10 ianuarie 2018 14:52:26
Problema Distante Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.12 kb
#include <bits/stdc++.h>
using namespace std;

#define NMAX 50005
#define INFINIT 0x3f

int T, N, M, S;
int D[NMAX], E[NMAX];
vector<pair<int, int> > graf[NMAX];

void citire() {
  scanf("%d %d %d ", &N, &M, &S);
  for (int i = 1; i <= N; i++) {
    scanf("%d ", &D[i]);
    graf[i].clear();
  }

  for (int i = 1; i <= M; i++) {
    int a, b, c;
    scanf("%d %d %d ", &a, &b, &c);
    graf[a].push_back({b, c});
    graf[b].push_back({a, c});
  }

  memset(E, INFINIT, sizeof E);
}

void calculCosturi() {
  queue<int> coada;
  coada.push(S);
  E[S] = 0;

  while (!coada.empty()) {
    int nod = coada.front();
    coada.pop();

    for (auto it: graf[nod]) {
      if(E[nod] + it.second < E[it.first]) {
        E[it.first] = E[nod] + it.second;
        coada.push(it.first);
      }
    }
  }
}

void verificare() {
  for (int i = 1; i <= N; i++) {
    if (E[i] != D[i]) {
      printf("NU\n");
      return;
    }
  }
  printf("DA\n");
}

int main() {
  freopen("distante.in", "r", stdin);
  freopen("distante.out", "w", stdout);

  scanf("%d ", &T);

  while (T--) {
    citire();
    calculCosturi();
    verificare();
  }

  return 0;
}