Cod sursa(job #2458616)

Utilizator Radu_FilipescuFilipescu Radu Radu_Filipescu Data 21 septembrie 2019 10:51:29
Problema Distante Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.76 kb
#include <fstream>
#include <queue>
#include <vector>

using namespace std;

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

typedef pair<int, int> pii;

const int NMAX = 50002;
const int INF = 2000000000;

int T;
int N, M, source;
int d[NMAX], d2[NMAX];
vector <int> Ad[NMAX];
vector <int> Cost[NMAX];
bool in_h[NMAX];

void Do();

void Read()
{
  int a, b, d;

  fin >> T;

  for( int i = 1; i <= T; ++i )
  {
    fin >> N >> M >> source;

    for( int i = 1; i <= N; ++i )
      fin >> d2[i];

    for( int i = 1; i <= M; ++i )
    {
      fin >> a >> b >> d;

      Ad[a].push_back( b );
      Cost[a].push_back( d );

      Ad[b].push_back( a );
      Cost[b].push_back( d );
    }

    Do();
  }
}

void Do()
{
   for( int i = 1; i <= N; ++i )
     d[i] = INF;

   d[source] = 0;

   priority_queue <pii, vector<pii>, greater<pii> > Heap;
   int nod;

   Heap.push( make_pair( 0, source ) );

   while( !Heap.empty() )
   {
     nod = Heap.top().second;
     Heap.pop();

     if( in_h[nod] ) continue;
     else in_h[nod] = true;

     if( d[nod] != d2[nod] ) break;

     for( int i = 0; i < Ad[nod].size(); ++i )
     {
        int w = Ad[nod][i];

        if( d[nod] + Cost[nod][i] < d[w] )
        {
          d[w] = d[nod] + Cost[nod][i];

          Heap.push( make_pair( d[w], w ) );
        }
     }
   }

   bool ok = true;
   for( int i = 1; i <= N; ++i )
     if( d[i] != d2[i] )
     {
       ok = false;
       break;
     }

   ( ok ) ? fout << "DA\n" : fout << "NU\n";

   for( int i = 1; i <= N; ++i )
   {
     Ad[i].clear();
     Cost[i].clear();
     in_h[i] = false;
   }
}

int main()
{
   Read();

   fin.close();
   fout.close();

   return 0;
}