Pagini recente » Cod sursa (job #2382612) | Istoria paginii utilizator/hai_la_olimpiada_2019-2020_sv | Cod sursa (job #3130910) | Cod sursa (job #2798002) | Cod sursa (job #2397482)
#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");
vector < pair < int, int >>G[NMAX];
struct compare
{
bool operator () (int x, int y)
{
return D[x] > D[y];
}
}
priority_queue < int, vector < int >, compare > Coada;
void
Dijkstra (int nodStart)
{
for (int i = 1; i <= n; i++)
{
D[i] = oo;
InCoada[i] = false;
}
D[nodStart] = 0;
InCoada[nodStart] = true;
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++)
{
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);
}
if (verify ())
fout << "DA" << "/n";
else
fout << "NU" << "/n";
}
int
main ()
{
Citire();
return 0;
}