Cod sursa(job #2813458)

Utilizator alessiamtr12Mitrica Alessia alessiamtr12 Data 6 decembrie 2021 18:26:31
Problema Distante Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.53 kb
#include <fstream>
#include<vector>
#include<queue>
#include<climits>
using namespace std;
ifstream fin("distante.in");
ofstream fout("distante.out");
vector<pair<int,int>>v[50001];
priority_queue<pair<int,int>,vector<pair<int,int>>,greater<pair<int,int>>>pq;
int costuri[50001],n,m,x,y,cost,t,k,w[50001];
bool viz[50001];
void dijkstra(int k)
{
    costuri[k]=0;
    pq.push({0,k});

    while(!pq.empty())
    {
        int nod=pq.top().second;
        int cost=pq.top().first;
        pq.pop();
        if(viz[nod]==1)
            continue;
        viz[nod]=1;
        for(auto x:v[nod])
        {
            if(costuri[x.first]>x.second+cost)
            {
                costuri[x.first]=x.second+cost;
                pq.push({costuri[x.first],x.first});

            }
        }
    }
}
int main()
{
    fin>>t;
    while(t--)
    {
        fin>>n>>m>>k;
        for(int i=1;i<=n;i++)
            fin>>w[i];
      for(int i=1;i<=m;i++)
      {
        fin>>x>>y>>cost;
        v[x].push_back({y,cost});
        v[x].push_back({x,cost});
      }
      for(int i=1;i<=n;i++)
         {
             costuri[i]=INT_MAX;
             viz[i]=0;
         }
      dijkstra(k);
      bool ok=1;
      for(int i=1;i<=n;i++)
      {
          if(w[i]!=costuri[i])
          {
              ok=0;
              break;
          }
      }
      if(ok==1)
        fout<<"DA\n";
      else
        fout<<"NU\n";

        for(int i=1;i<=n;i++)
            v[i].clear();
    }

    return 0;
}