Cod sursa(job #1651297)

Utilizator pickleVictor Andrei pickle Data 12 martie 2016 23:06:25
Problema Distante Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.1 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#include <queue>

using namespace std;
typedef pair<int, int> pii;
const int Nmax = 50444;

vector<pii> G[Nmax];
int d[Nmax];

int main() {
  ifstream fin ("distante.in");
  ofstream fout ("distante.out");

  int T, N, M, s, a, b, c;
  fin >> T;
  while(T--) {
    fin >> N >> M >> s;
    --s;
    for (int i = 0; i < N; ++i) {
      G[i].clear();
    }
    for (int i = 0; i < N; ++i)
      fin >> d[i];
    for (int i = 0; i < M; ++i) {
      fin >> a >> b >> c;
      --a, --b;
      G[a].push_back({b, c});
      G[b].push_back({a, c});
    }
    if (d[s] != 0) {
      fout << "NU" << endl;
      continue;
    };
    bool ok = true;
    for (int x = 0; x < N && ok; ++x) {
      if (x == s)
        continue;
      bool reach = false;
      for(pii P: G[x]) {
        if (d[x] > d[P.first] + P.second) {
          ok = false;
          break;
        } else if (d[x] == d[P.first] + P.second) {
          reach = true;
        }
      }
      if (!reach)
        ok = false;
    }
    fout << (ok ? "DA" : "NU") << '\n';
  }

  return 0;
}