Cod sursa(job #2474511)

Utilizator alexsandulescuSandulescu Alexandru alexsandulescu Data 15 octombrie 2019 13:09:06
Problema Distante Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.44 kb
#include <bits/stdc++.h>

using namespace std;

ifstream f("distante.in");
ofstream g("distante.out");

constexpr int INF = 0x3f3f3f3f;

typedef pair<int, int> pcy;


int T, N, M, x, y, c, S, s[50003], D[50003];
vector<pair<int, int>> G[50003];
priority_queue<pcy, vector<pcy>, greater<pcy>> Q;

bool sel[50003];


void dijkstra(int pl);

int main() {

   f >> T;
   for(int t = 1; t <= T; t++) {
      f >> N >> M >> S;
      for(int i = 1; i <= N; i++)
         f >> s[i];
      for(int i = 1; i <= M; i++) {
         f >> x >> y >> c;
         G[x].push_back({c, y});
      }
      dijkstra(S);
      bool ok = true;
      for(int i = 1; i <= N; i++)
         if(s[i] != D[i]) { ok = false; break; }
      g << (ok? "DA" : "NU") << "\n";
      for(int i = 1; i <= N; i++)
         G[i].clear();
   }
   return 0;
}

void dijkstra(int pl) {
   for(int i = 1; i <= N; i++) {
      D[i] = INF, sel[i] = false;
   }
   D[pl] = 0;
   sel[pl] = true;

   for(auto i : G[pl]) {
      D[i.second] = i.first;
      Q.push(i);
   }

   while(!Q.empty()) {
      while(!Q.empty() && sel[Q.top().second])
         Q.pop();

      if(Q.empty()) break;

      int c = Q.top().first, y = Q.top().second;
      sel[y] = true;
      Q.pop();

      for(auto i : G[y])
         if(c + i.first < D[i.second]) {
            D[i.second] = c + i.first;
            Q.push({D[i.second], i.second});
         }
   }

}