Cod sursa(job #1304232)

Utilizator robertstrecheStreche Robert robertstreche Data 28 decembrie 2014 19:32:07
Problema Distante Scor 50
Compilator cpp Status done
Runda tema_vacanta_iarna Marime 1.21 kb
#include <fstream>
#include <queue>
#include <vector>

#define lmax 50005
#define inf 5000000
#define pb push_back
#define mp make_pair

using namespace std;

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

int t,n,m,s,x,y,z;
int dist[lmax],distp[lmax];

queue <int>q;

inline void solve()
{
    vector <pair<int,int> >v[lmax];
    vector <pair<int,int> >::iterator it;


    f>>n>>m>>s;

    for (int i=1;i<=n;i++)
     {
         f>>distp[i];
         dist[i]=inf;
     }
    for (int i=1;i<=m;i++)
     {
         f>>x>>y>>z;

         v[x].pb(mp(y,z));
         v[y].pb(mp(x,z));
     }
    q.push(s);
    dist[s]=0;

    while (q.size())
     {
         int nod=q.front();
         q.pop();

         for (it=v[nod].begin();it!=v[nod].end();it++)
          if (dist[nod]+(*it).second<dist[(*it).first])
           {
               dist[(*it).first]=dist[nod]+(*it).second;
               q.push((*it).first);
           }
     }
    for (int i=1;i<=n;i++)
     if (dist[i]!=distp[i])
      {
          g<<"NU\n";
          return;
      }
    g<<"DA\n";
}

int main()
{
   f>>t;

   for (int i=1;i<=t;i++)
     solve();

  f.close();
  g.close();
}