Pagini recente » Cod sursa (job #993904) | Cod sursa (job #1860078) | Cod sursa (job #145360) | Cod sursa (job #516556) | Cod sursa (job #1875613)
#include <fstream>
#include <algorithm>
#include <vector>
#include <queue>
#include <cstring>
using namespace std;
ifstream fin("distante.in");
ofstream fout("distante.out");
const int NMAX = 50005;
const int INF = 500000005;
int queries, n, m, src;
vector < vector < pair < int, int > > > G(NMAX);
int D[NMAX], dist[NMAX];
void init()
{
for (int i = 1; i <= n; ++ i)
G[i].erase(G[i].begin(), G[i].end());
memset(dist, 0, sizeof(dist));
}
void read()
{
fin >> n >> m >> src;
for (int i = 1; i <= n; ++ i)
fin >> D[i];
for (int i = 0; i < m; ++ i)
{
int x, y, z;
fin >> x >> y >> z;
G[x].push_back(make_pair(z, y));
G[y].push_back(make_pair(z, x));
}
}
void dijkstra()
{
priority_queue < pair < int, int >, vector < pair < int, int > >, greater < pair < int, int > > > PQ;
for (int i = 1; i <= n; ++ i)
dist[i] = INF;
dist[src] = 0;
PQ.push(make_pair(0, src));
while (!PQ.empty())
{
int d = PQ.top().first;
int par = PQ.top().second;
PQ.pop();
if (d <= dist[par])
for (vector < pair < int, int > > :: iterator it = G[par].begin(); it != G[par].end(); ++ it)
{
int c = (*it).first;
int father = (*it).second;
if (dist[father] > d + c)
{
dist[father] = d + c;
PQ.push(make_pair(dist[father], father));
}
}
}
}
bool check()
{
for (int i = 1; i <= n; ++ i)
if (D[i] != dist[i])
return false;
return true;
}
int main()
{
fin >> queries;
for (int i = 1; i <= queries; ++ i)
{
init();
read();
dijkstra();
fout << (check() ? "DA\n" : "NU\n");
}
fin.close();
fout.close();
return 0;
}