Cod sursa(job #2083425)

Utilizator AlexandruLuchianov1Alex Luchianov AlexandruLuchianov1 Data 7 decembrie 2017 18:26:52
Problema Distante Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.65 kb
#include <iostream>
#include <fstream>
#include <queue>
#include <vector>

using namespace std;
ifstream in ("distante.in");
ofstream out ("distante.out");
int const nmax = 50000;
int const inf = 1000000000;
struct Edge{
  int to;
  int cost;
};
struct Node{
  int val;
  int index;
  bool operator > (Node a) const{
    if(val != a.val){
      return val > a.val;
    } else{
      return index > a.index;
    }
  }
};
vector<Edge> g[5 + nmax];
int n , m , source;
int d[5 + nmax];
int dp[5 + nmax];
int seen[5 + nmax];
void dijkstra(){
  priority_queue< Node ,vector<Node> ,greater<Node> > pq;
  dp[source] = 0;
  pq.push({0 , source});
  while(0 < pq.size()){
    int node = pq.top().index;
    pq.pop();
    if(seen[node] == 0){
      seen[node] = 1;
      for(int i = 0 ; i < g[node].size() ;i++){
        Edge e = g[node][i];
        if(seen[e.to] == 0){
          if(dp[node] + e.cost < dp[e.to]){
            dp[e.to] = dp[node] + e.cost;
            pq.push({dp[e.to] , e.to});
          }
        }
      }
    }
  }
}
int main()
{
  int t;
  in>>t;
  for(int tcase = 1 ; tcase <= t ;tcase++){
    in>>n>>m>>source;
    for(int i = 1 ; i <= n ;i++){
      in>>d[i];
      g[i].clear();
      dp[i] = inf;
      seen[i] = 0;
    }
    for(int i = 1 ; i <= m ;i++){
      int a , b , c;
      in>>a>>b>>c;
      g[a].push_back({b , c});
      g[b].push_back({a , c});
    }
    dijkstra();
    bool ok = 0;
    for(int i = 1 ; i <= n ;i++){
      if(dp[i] != d[i]){
        ok = 1;
      }
    }
    if(ok == 0){
      out<<"DA\n";
    } else if(ok == 1){
      out<<"NU\n";
    }
  }
  return 0;
}