Cod sursa(job #2800981)

Utilizator teochess2017Togan Teodor-Bogdan teochess2017 Data 14 noiembrie 2021 17:04:01
Problema Distante Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.71 kb
#include <iostream>
#include <queue>
#include <vector>
#include <stdio.h>

using namespace std;

#define MAXN 50000
#define MAXM 100000
#define MAXVAL 1000
#define INF (MAXN * MAXVAL + 1)

int best[MAXN], v[MAXN];

struct nod{

  int node, cost;
  bool operator < (const nod &other) const{
      return cost > other.cost;
  }
};

priority_queue <nod> pq;
vector <nod>arb[MAXN];

void dijkstra(int s){
  int i;
  nod nodcoada;
  pq.push({s, 0});
  while(0 < pq.size()){
    nodcoada = pq.top();
    pq.pop();
    if(best[nodcoada.node] == INF){
      best[nodcoada.node] = nodcoada.cost;
      for(i = 0; i < arb[nodcoada.node].size(); i++){
        if(best[arb[nodcoada.node][i].node] == INF){
          pq.push({arb[nodcoada.node][i].node, best[nodcoada.node] + arb[nodcoada.node][i].cost});
        }
      }
    }
  }
}

int main()
{
    FILE *fin, *fout;
    int n, m, a, b, i, cost, t, j, st, s;
    fin = fopen("distante.in", "r");
    fscanf(fin, "%d", &t);
    fout = fopen("distante.out", "w");
    for(j = 0; j < t; j++){
      fscanf(fin, "%d%d%d", &n, &m, &s);
      for(i = 0; i < n; i++){
        fscanf(fin, "%d", &v[i]);
      }
      for(i = 0; i < m; i++){
        fscanf(fin, "%d%d%d", &a, &b, &cost);
        arb[a - 1].push_back({b - 1, cost});
        arb[b - 1].push_back({a - 1, cost});
      }
      for(i = 0; i < n; i++){
        best[i] = INF;
      }
      dijkstra(s - 1);
      st = 0;
      for(i = 1; i < n; i++){
        if(best[i] != v[i]){
          st = 1;
        }
      }
      if(st == 0){
        fprintf(fout, "DA\n");
      }else{
        fprintf(fout, "NU\n");
      }
    }
    fclose(fin);
    fclose(fout);
    return 0;
}