Cod sursa(job #2640206)

Utilizator euyoTukanul euyo Data 5 august 2020 16:38:59
Problema Distante Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.26 kb
#include <fstream>
#include <vector>
#include <queue>

using namespace std;

ifstream fin( "distante.in" );
ofstream fout( "distante.out" );

const int MaxN = 50002;
const int MaxCost = 2000000000;

int n, m, stNode;
int db[MaxN], dist[MaxN];
vector<int> G[MaxN];
vector<int> cost[MaxN];
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> q;
 
void solveTest() {
  int node;
  
  q.push( { 0, stNode } );
  dist[1] = 0;
  while ( !q.empty() ) {
	node = q.top().second;
	q.pop();
	for ( int i = 0; i < G[node].size(); ++i ) {
	  if ( dist[node] + cost[node][i] < dist[G[node][i]] ) {
		dist[G[node][i]] = dist[node] + cost[node][i]; 
		q.push( { dist[G[node][i]], G[node][i] } );
	  }
	}
  }
  int i = 1;
  while ( i <= n && db[i] == dist[i] ) {
	++i;
  }
  if ( i > n ) {
	fout << "DA\n";
  } else {
	fout << "NU\n";
  }
}

int main() {
  int t, x, y, c;
  
  fin >> t;
  while ( t-- ) {
	fin >> n >> m >> stNode;
	for ( int i = 1; i <= n; ++i ) {
      G[i].clear();
	  cost[i].clear();
	  dist[i] = MaxCost;
	  fin >> db[i];
	}
	for ( int i = 1; i <= m; ++i ) {   
	  fin >> x >> y >> c;
	  G[x].push_back( y );
	  G[y].push_back( x );
	  cost[x].push_back( c );
	  cost[y].push_back( c );
	}
    solveTest();
  }
  fin.close();
  fout.close();
  return 0;
}