Cod sursa(job #534957)

Utilizator david_raucaRauca Ioan David david_rauca Data 16 februarie 2011 16:50:53
Problema Distante Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.22 kb
#include<fstream>
#include<vector>
#include<queue>
using namespace std;

#define INF 0x3f3f3f3f

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

vector<vector<pair<int, int> > > G;
vector<long> M;

//bool sel[50005]; 
vector<long> sol;

int t, n, m, s;

void Read();
void Solve();

int main()
{
    Read();
    
    fin.close();
    fout.close();
    
    return 0;
}

void Read()
{
     fin >> t;
     for( int e = 1; e <= t; ++e )
     {
          fin >> n >> m >> s;
          G.resize(n+1);
          M.resize(n+1);
          sol.resize(n+1);
          for( int i = 1 ; i <= n; ++i )
          {
               fin >> M[i];
               sol[i] = INF;
               //sel[i] = false;
          }
               
          int x, y, c;
          for( int i = 1; i <= m; ++i )
          {
               fin >> x >> y >> c;
               G[x].push_back( make_pair( y, c) );
               G[y].push_back( make_pair( x, c) );
          }
          /*
          for( int i = 1; i <= n; ++i )
          {
               fout << i << ": ";
               for( int j = 0; j < G[i].size(); ++j )
                    fout << "( " << G[i][j].first << ", " << G[i][j].second << " ) ";
               fout << "\n";
          }
          */
          Solve();
     }
}

void Solve()
{
     queue<int> Q;
     
     sol[s] = 0;
     
     if( sol[s] != M[s] )
     {
         fout << "NU" << '\n';
         G.clear();
         return;
     }
     
     Q.push(s);
     
     while( !Q.empty() )
     {
            int k = Q.front();
            
            for( int i = 0; i < G[k].size(); ++i )
                 if( sol[ G[k][i].first ] > sol[k] + G[k][i].second )
                 {
                     sol[ G[k][i].first ] = sol[k] + G[k][i].second;
                     Q.push( G[k][i].first );
                 }
            Q.pop();
     }
     /*
     for( int i = 1; i <= n; ++i )
          fout << sol[i] << ' ';
     */
     for( int i = 1; i <= n; ++i )
          if( sol[i] != M[i] )
          {
              fout << "NU" << '\n';
              G.clear();
              return;
          }
     
     fout << "DA" <<'\n';
     G.clear();
}