Cod sursa(job #2495183)

Utilizator sygAndreiIonitaIonita Andrei sygAndreiIonita Data 18 noiembrie 2019 22:37:22
Problema Distante Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.46 kb
#include <fstream>
#include <vector>
#include <queue>

using namespace std;

priority_queue <pair <int,int> > pq;
bool ok[50001];
int ans[50001],cica[50001];
vector < pair <int,int> > v[50001];

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

void dijkstra (int s)
{
  pq=priority_queue <pair <int,int> >();
  pair <int,int> p;
  pq.push({0,s});
  while (!pq.empty())
  {
    p=pq.top();
    pq.pop();
    swap(p.first,p.second);
    p.second=-p.second;
    if (ans[p.first]<p.second&&ok[p.first])
      continue;
    int nod,dist;
    for (int i=0;i<v[p.first].size();++i)
    {
      nod=v[p.first][i].second;
      dist=v[p.first][i].first;
      if (ok[nod]&&ans[nod]<=dist+p.second)
        continue;
      ok[nod]=1;
      ans[nod]=dist+p.second;
      pq.push({-dist-p.second,nod});
    }
  }
  for (int i=1;i<=50000;i++)
    v[i].clear();
}

int main()
{
    int t,n,m,s,a,b,c;
    in>>t;
    for (int i=1;i<=t;++i)
    {
      in>>n>>m>>s;
      for (int j=1;j<=n;j++)
        ans[j]=0,ok[j]=0;
      for (int j=1;j<=n;j++)
        in>>cica[j];
      for (int j=1;j<=m;j++)
      {
        in>>a>>b>>c;
        v[a].push_back({c,b});
        v[b].push_back({c,a});
      }
      dijkstra(s);
      ans[s]=0;
      bool ok=0;
      for (int j=1;j<=n&&ok==0;j++)
        if (ans[j]!=cica[j])
           ok=1;
      if (ok)
        out<<"NU"<<'\n';
      else
        out<<"DA"<<'\n';
    }
    return 0;
}