Pagini recente » Cod sursa (job #2808418) | Istoria paginii runda/simlotvrancea2010baraj1.1 | Cod sursa (job #1076195) | Cod sursa (job #1433860) | Cod sursa (job #2397597)
#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;
}