Cod sursa(job #2797398)

Utilizator Luca_Miscocilucainfoarena Luca_Miscoci Data 9 noiembrie 2021 20:34:29
Problema Distante Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.83 kb
#include <fstream>
#include <queue>
#define NMAX 50000
#define INF (1<<30)
using namespace std;

int sol[NMAX + 1];
int solpre[NMAX + 1];

struct nod{

  int node, cost;
  bool operator < (const nod &other) const{
      return cost > other.cost;
  }
};
priority_queue <nod> q;
vector <nod> v[NMAX + 1];
void dijkstra (){
    int current_node;
    int current_dist;
    while (!q.empty()){
      current_node = q.top().node;
      current_dist = q.top().cost;
      q.pop();
      if (sol[current_node] == INF){
        sol[current_node] = current_dist;

        for (int i = 0; i < v[current_node].size(); i++){
          if (sol[v[current_node][i].node] == INF)
            q.push({v[current_node][i].node, current_dist + v[current_node][i].cost});
        }
      }
    }
}
  ifstream fin ("distante.in");
  ofstream fout ("distante.out");

	// MULT RESPECT SI FAIMA DOMNULUI LUCA ILIE MIHAI 9H ICHB
int getNum() {
  char ch;
  int n;

  ch = fin.get ();
  while ( isspace (ch) && ch != EOF )
    ch = fin.get();

  n = 0;
  while ( isdigit( ch ) ) {
    n = n * 10 + ch - '0';
    ch = fin.get();
  }
  return n;
}
int main(){


  int n, m, k, t;
  fin >> t;
  while (t --){

    n = getNum();
    m = getNum();
    k = getNum();

    for (int i = 1; i <= n; i++){
        v[i].clear();
    }
    for (int i = 1; i <= n; i++)
      solpre[i] = getNum();
    int a, b, c;
    for (int i = 0; i < m; i++){
     fin >> a >> b >> c;
     v[a].push_back({b, c});
     v[b].push_back({a, c});
    }

    for (int i = 1; i <= n; i++)
      sol[i] = INF;
    q.push({k, 0});
    dijkstra();
    int i = 1;
    sol[k] = 0;
    while (i <= n && sol[i] == solpre[i]){

      i++;
    }
    if (i == n + 1)
      fout << "DA";
    else
      fout << "NU";
    fout << "\n";
  }
  return 0;
}