Cod sursa(job #2190061)

Utilizator Anastasia11Susciuc Anastasia Anastasia11 Data 29 martie 2018 18:37:28
Problema Distante Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.66 kb
#include <fstream>
#include <vector>
#include <set>
#include <cstring>
#define INF 0x3f3f3f3f
#define Nmax 50005

using namespace std;

ifstream f("distante.in");
ofstream g("distante.out");

void dijk()
{
    int n, m, s, dist_calc[Nmax], dist[Nmax];
    set <pair <int, int > > dij;
    vector <pair <int,int> >  v[Nmax];
    f >> n >> m >> s;
    for ( int i = 1 ; i <= n ; i ++ )
        f >> dist_calc[i];
    for (;m;m--)
     {int i,j,c;
         f >> i >> j >> c;
         v[i].push_back(make_pair(c,j));
         v[j].push_back(make_pair(c,i));
     }
     memset(dist,INF,sizeof(dist));
     dist[s]=0;
    dij.insert(make_pair(0,s));
     while(!dij.empty())
      {
          int old_cost = dij.begin()->first;
          int old_nod= dij.begin()->second;
           dij.erase(dij.begin());
           for ( int k = 0 ; k < v[old_nod].size(); k ++ )
            {
                int new_cost = v[old_nod][k].first;
                int new_nod = v[old_nod][k].second;
                 if(dist[new_nod]>old_cost+new_cost)
                  {
                      if(dist[new_nod]!=INF)
                       dij.erase(dij.find(make_pair(dist[new_nod],new_nod)));
                       dist[new_nod]=old_cost+new_cost;
                       dij.insert(make_pair(dist[new_nod],new_nod));
                  }
            }
      }
    bool ok=false;
    for ( int i = 1 ; i <= n && ok ==  false ; i ++ )
      if(dist_calc[i]!=dist[i])
        ok=true;
    if(ok == true )
      g << "NU\n";
     else
      g << "DA\n";
}

int main()
{
   int t;
    f >> t;
     while ( t -- )
     {
         dijk();
     }
    return 0;
}