Cod sursa(job #2797391)

Utilizator Luca_Miscocilucainfoarena Luca_Miscoci Data 9 noiembrie 2021 20:24:45
Problema Distante Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.51 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});
        }
      }
    }
}
int main(){

  ifstream fin ("distante.in");
  ofstream fout ("distante.out");
  int n, m, k, t;
  fin >> t;
  while (t --){

    fin >> n >> m >> k;

    for (int i = 1; i <= n; i++){
        v[i].clear();
    }
    for (int i = 1; i <= n; i++)
      fin >> solpre[i];
    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;
}