Cod sursa(job #3310221)

Utilizator Victor5539Tanase Victor Victor5539 Data 12 septembrie 2025 10:19:02
Problema Distante Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.43 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#define pb push_back

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

const int TMAX=10,NMAX=50000;
int i, t,n,m,start,sol[NMAX+5],node,node1,node2,cost,d[NMAX+5];
bool ans;
vector <pair<int,int>> edge[NMAX+5];
priority_queue <pair<int,int> , vector<pair<int,int>> , greater<pair<int,int>>> pq;

int main()
{
  ios_base::sync_with_stdio(false);
  fin.tie(0); fout.tie(0);

  fin>>t;

  while (t--)
  {
    ans=1;
    fin>>n>>m>>start;

    for (i=1; i<=n; i++)
      fin>>sol[i];

    while (m--)
    {
      fin>>node1>>node2>>cost;
      edge[node1].pb({node2,cost});
      edge[node2].pb({node1,cost});
    }

    for (i=1; i<=n; i++)
      d[i]=2e9;

    d[start]=0;
    pq.push({d[start],start});

    while (!pq.empty())
    {
       node=pq.top().second; cost=pq.top().first;
       pq.pop();

       if (cost>d[node])
        continue;

       for (auto x: edge[node])
       {
         int node2=x.first,cost2=x.second;

         if (d[node2]>cost+cost2)
         {
           d[node2]=cost+cost2;
           pq.push({d[node2],node2});
         }
       }
    }

    for (i=1; i<=n; i++)
      if (sol[i]!=d[i])
        ans=0;

    for (i=1; i<=n; i++)
      edge[i].clear();

    if (ans==1)
      fout<<"DA"<<'\n';
    else
      fout<<"NU"<<'\n';

  }
  return 0;
}