Cod sursa(job #794713)

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

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

vector< piii > e;
int n, dist[NMAX], d[NMAX];

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

   dist[start] = 0;
   bool changed = true;
   for(int i=0; i<n-1 && changed; i++)
   {
      changed = 0;
      for(vector<piii >::iterator it = e.begin(); it!=e.end(); it++) {
         int a = it->second.first;
         int b = it->second.second;
         if( dist[a] + it->first < dist[b] )
            dist[b] = dist[a] + it->first, changed = 1;
         if( dist[b] + it->first < dist[a] )
            dist[a] = dist[b] + it->first, changed = 1;
      }
   }
}

int main() {
   ifstream fin(INFILE);
   ofstream fout(OUTFILE);

   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();
      for(; m; m--) {
         int a, b, c;
         fin >> a >> b >> c;
         e.pb(make_pair(c, make_pair(a-1, b-1)));
      }

      bellman_ford(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;
}