Pagini recente » Cod sursa (job #3216835) | Cod sursa (job #2599472) | Arhiva de probleme, pregatire pentru concursuri de informatica | Cod sursa (job #1266797) | Cod sursa (job #1090096)
#include <cstdio>
#include <vector>
#include <queue>
#include <cstring>
#define INF 0x3f3f3f3f
#define NMAX 50002
using namespace std;
int T, N, M, cost[NMAX], start, dZ[NMAX];
vector <int> v[NMAX];
queue <int> q;
void ReadData ()
{
//fin >> N >> M >> start;
scanf ("%d %d %d", &N, &M, &start);
for (int i = 1; i <= N; ++i)
//fin >> dZ[i];
scanf ("%d", &dZ[i]);
for (int i = 1, a, b, c; i <= M; ++i)
{
//fin >> a >> b >> c;
scanf ("%d %d %d", &a, &b, &c);
v[a].push_back (b);
v[a].push_back (c);
v[b].push_back (a);
v[b].push_back (c);
}
for (int i = 1; i <= N; ++i)
{
if (i != start)
cost[i] = INF;
}
cost[start] = 0;
}
void Solve ()
{
q.push (start);
while (!q.empty ())
{
int x = q.front ();
for (int i = 0; i < v[x].size (); i += 2)
{
if (cost[v[x][i]] > cost[x] + v[x][i + 1])
{
q.push (v[x][i]);
cost[v[x][i]] = cost[x] + v[x][i + 1];
}
}
q.pop ();
}
}
int Check ()
{
cost[start] = 0;
for (int i = 1; i <= N; ++i)
{
if (cost[i] != dZ[i])
return 0;
}
return 1;
}
int main ()
{
//fin >> T;
freopen ("distante.in", "r", stdin);
freopen ("distante.out", "w", stdout);
scanf ("%d", &T);
for (int i = 1; i <= T; ++i)
{
ReadData ();
Solve ();
if (Check ())
//fout << "DA\n";
printf ("DA\n");
else
//fout << "NU\n";
printf ("NU\n");
//memset (cost, 0, sizeof(cost));
memset (v, 0, sizeof(v));
}
//fin.close (); fout.close ();
return 0;
}