Cod sursa(job #2564439)

Utilizator nicolaee2Martinescu Nicolae nicolaee2 Data 1 martie 2020 21:25:36
Problema Distante Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.27 kb
#include<bits/stdc++.h>
#include<string.h>

using namespace std;

#define NMAX 100005

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

int n,m,s;
vector<pair<int,int > > ma[NMAX];
int dis[NMAX];


void citire()
{
   for(int i=1;i<=n;i++)
   {
      if(!ma[i].empty())
         ma[i].clear();
   }

   fin>>n>>m>>s;
   for(int i=1;i<=n;i++)
      fin>>dis[i];

   for(int i=1;i<=m;i++)
   {
      int x,y,c;
      fin>>x>>y>>c;
      ma[x].push_back(make_pair(y,c));
      ma[y].push_back(make_pair(x,c));
   }

}

void rezolva()
{
   int ok = 1;
   if(dis[s] != 0)
      ok = 0;

   vector<int> exista(n+1,0);

   for(int i = 1;i<=n;i++)
   {
      for(int j=0;j<ma[i].size();j++)
      {
         int vecin = ma[i][j].first;
         int cost = ma[i][j].second;
         if(dis[i] + cost == dis[vecin])
         {
            exista[vecin] = 1;
         }
         else if(dis[i] + cost < dis[vecin])
            ok = 0;

      }
   }

   for(int i=1;i<=n;i++)
   {
      if(i!=s && !exista[i])
         ok = 0;
   }

   if(!ok)
      fout<<"NU"<<'\n';
   else
      fout<<"DA"<<'\n';


}

int main()
{
   int t;
   fin>>t;
   for(int i=1;i<=t;i++)
   {
      citire();
      rezolva();
   }



}