Cod sursa(job #794715)

Utilizator desoComan Andrei deso Data 6 octombrie 2012 21:20:45
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.5 kb
#include <vector>
#include <fstream>
#include <queue>
using namespace std;

#define INFILE "distante.in" 
#define OUTFILE "distante.out"
#define pb push_back
#define pii pair<int,int>
#define NMAX 50010
#define inf 50000000

vector< vector< pii > > e;
int n, dist[NMAX], d[NMAX];
priority_queue<pii, vector<pii >, greater<pii > > q;
ifstream fin(INFILE);
ofstream fout(OUTFILE);

void dijkstra(int start) {
   for(int i=0; i<n; i++)
      dist[i] = inf;

   q.push(make_pair(0, start));
   while( !q.empty() )
   {
      pii nod = q.top(); 
      q.pop();
      // first = cost, second = vecin
      if( dist[nod.second]<inf ) continue;

      dist[nod.second] = nod.first;
      for(vector<pii >::iterator it=e[nod.second].begin(); it!=e[nod.second].end(); it++)
         if( dist[ it->second ]==inf )
            q.push(make_pair(it->first + nod.first, it->second));
   }
}

int main() {

   int cases;
   fin >> cases;
   for(;cases; cases--) {
      int m, start;
      fin >> n >> m >> start;
      for(int i=0; i<n; i++)
         fin >> d[i];
      e.clear();
      e.resize(n);
      for(; m; m--) {
         int a, b, c;
         fin >> a >> b >> c;
         e[a-1].pb(make_pair(c, b-1));
         e[b-1].pb(make_pair(c, b-1));
      }

      dijkstra(start-1);
      bool ok = true;
      for(int i=0; i<n && ok; i++)
         if( dist[i]!=d[i] )
            ok = false;

      fout << (ok ? "DA" : "NU");
      if( cases>1 )  fout << "\n";
   }
   return 0;
}