Cod sursa(job #2397597)

Utilizator alexbuzescuAlexandru Buzescu alexbuzescu Data 4 aprilie 2019 16:35:49
Problema Distante Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.77 kb
#include <iostream>
#include <fstream>
#include <queue>
#include <vector>
#define NMAX 50001
using namespace std;
const int oo = (1 << 30);
int D[NMAX], n, m, cate, v[NMAX];
bool InCoada[NMAX];
ifstream fin ("distante.in");
ofstream fout ("distante.out");
struct compare
{
  bool operator () (int x, int y)
  {
    return D[x] > D[y];
  }

};
priority_queue < int, vector < int >, compare > Coada;
void Dijkstra (int nodStart,vector < pair<int,int> >G[NMAX])
{
  for (int i = 1; i <= n; i++)
    {
      D[i] = oo;
      InCoada[i] = false;
    }
  D[nodStart] = 0;
  InCoada[nodStart] = true;
  Coada.push(nodStart);
  while (!Coada.empty ())
    {
      int nodCurent = Coada.top ();
      Coada.pop ();
      InCoada[nodCurent] = false;
      for (size_t i = 0; i < G[nodCurent].size (); i++)
	{
	  int vecin = G[nodCurent][i].first;
	  int cost = G[nodCurent][i].second;
	  if (D[nodCurent] + cost < D[vecin])
	    {
	      D[vecin] = D[nodCurent] + cost;
	      if (InCoada[vecin] == false)
		{
		  Coada.push (vecin);
		  InCoada [vecin] = true;
		}
	    }
	}
    }
}

bool
verify ()
{
  int i;
  for (i = 1; i <= n; i++)
    {
      if (v[i] != D[i])
	{
	  return false;
	}
    }
  return true;
}

void
Citire ()
{

  fin >> cate;
  int nodStart;
  for (int ind = 1; ind <= cate; ind++)
    {
      vector < pair < int, int > >G[NMAX];
      fin >> n >> m >> nodStart;
      for (int j = 1; j <= n; j++)
	{
	  fin >> v[j];
	}
      for (int i = 1; i <= n; i++)
	{
	  int x, y, c;
	  fin >> x >> y >> c;
	  G[x].push_back (make_pair (y, c));
	}
      Dijkstra (nodStart,G);
      if (verify ())
    fout << "DA" << "\n";
  else
    fout << "NU" << "\n";
    }


}

int
main ()
{

    Citire();
  return 0;
}