Pagini recente » Cod sursa (job #3230881) | Cod sursa (job #1477554) | Cod sursa (job #1602485) | Cod sursa (job #1370646) | Cod sursa (job #476327)
Cod sursa(job #476327)
#include <cstdio>
#include <vector>
#include <queue>
using namespace std;
#define NMAX 50050
#define INF 1 << 30
int cost[NMAX], C[NMAX], viz[NMAX], n, m, s, t;
vector < pair <int, int> > G[NMAX];
queue <int> Q;
void read ();
void bellman_ford ();
int check ();
int main () {
freopen ("distante.in", "r", stdin);
freopen ("distante.out", "w", stdout);
scanf ("%d", &t);
for ( ; t--; ) {
read ();
bellman_ford ();
if (check ())
printf ("DA\n");
else
printf ("NU\n");
}
return 0;
}
void read () {
int i, x, y, c;
scanf ("%d %d %d", &n, &m, &s);
for (i = 1; i <= n; i++) {
scanf ("%d", &cost[i]);
G[i].clear ();
}
for (i = 1; i <= m; i++) {
scanf ("%d %d %d", &x, &y, &c);
G[x].push_back (make_pair (y, c));
G[y].push_back (make_pair (x, c));
}
}
void bellman_ford () {
int i, nod, fiu, cst;
for (i = 1; i <= n; i++)
C[i] = INF;
Q.push(s), viz[s] = 1, C[s] = 0;
while (!Q.empty()) {
nod = Q.front();
for (i = 0; i < (int) G[nod].size(); i++) {
fiu = G[nod][i].first, cst = G[nod][i].second;
if (C[nod] + cst < C[fiu]) {
C[fiu] = C[nod] + cst;
if (!viz[fiu])
Q.push(fiu), viz[fiu] = 1;
}
}
Q.pop();
}
}
int check () {
int i;
for (i = 1; i <= n; i++)
if (cost[i] != C[i])
return 0;
return 1;
}