Pagini recente » Cod sursa (job #266988) | Cod sursa (job #1123591) | Cod sursa (job #2300549) | Concursul National de Soft Grigore Moisil Lugoj, Clasament 9-10 | Cod sursa (job #2089845)
#include <bits/stdc++.h>
#define in "distante.in"
#define out "distante.out"
#define MN 50005
using namespace std;
struct nod
{
int vrf, cst;
nod* next;
};
typedef nod* graf;
graf A[MN];
int Sol[MN], T, N, M, S;
void add(int srs, int vrf, int cst)
{
graf p = new nod;
p->vrf = vrf;
p->cst = cst;
p->next = A[srs];
A[srs] = p;
}
bool checkNode(int srs)
{
bool ok = srs==S;
graf q = A[srs];
while(q)
{
if(Sol[srs] + q->cst < Sol[q->vrf]) return 0;
if(Sol[q->vrf] + q->cst == Sol[srs]) ok = 1;
q = q->next;
}
return ok;
}
bool checkValidSol()
{
if(Sol[S]!=0) return 0;
for(int i = 1; i <= N; ++i)
if(!checkNode(i)) return 0;
return 1;
}
int main()
{
assert(freopen(in, "r", stdin));
assert(freopen(out,"w", stdout));
assert(scanf("%d", &T));
while(T--)
{
assert(scanf("%d%d%d", &N, &M, &S));
for(int i = 1; i <= N; ++i)
assert(scanf("%d", Sol+i));
memset(A, 0, sizeof(A));
for(int a, b, c; M; --M)
{
assert(scanf("%d%d%d", &a, &b, &c));
if(a!=b)
add(a, b, c), add(b, a, c);
}
assert(printf("%s\n", (checkValidSol()? "DA":"NU")));
}
fclose(stdin), fclose(stdout);
return 0;
}