Pagini recente » Cod sursa (job #1997594) | Cod sursa (job #874743) | Cod sursa (job #1567459) | Cod sursa (job #1115419) | Cod sursa (job #153757)
Cod sursa(job #153757)
#include <stdio.h>
#define NMAX 50005
struct nod
{
int v, cost;
nod *next;
};
int N, M, S, d[NMAX], T, r[NMAX];
nod *m[NMAX];
void adaug(int a, int b, int c)
{
nod *aux;
aux = new nod;
aux -> v = b;
aux -> cost = c;
aux -> next = m[a];
m[a] = aux;
}
int rezolv()
{
nod *p;
int ex = 1, i;
if ( d[S] != 0)
ex = 0;
for ( i = 1; i <= N && ex; i++)
{
for ( p = m[i]; p; p = p -> next)
if ( p->v != S && d[i] + p -> cost < d[ p -> v])
ex = 0;
else
if ( d[i] + p -> cost == d[ p-> v] )
r[ p->v] = 1;
}
if (ex)
for ( i = 1; i <= N; i++)
if ( !r[i] && i != S)
ex = 0;
return ex;
}
int main()
{
int i, t, a, b, c;
freopen("distante.in", "r", stdin);
freopen("distante.out", "w", stdout);
scanf("%d", &T);
for ( t = 1; t <= T; t++)
{
scanf("%d %d %d", &N, &M, &S);
for ( i = 1; i <= N; i++)
scanf("%d", &d[i]);
for ( i = 1; i <= M; i++)
{
scanf("%d %d %d", &a, &b, &c);
adaug(a, b, c);
adaug(b, a, c);
}
if ( rezolv() )
printf("DA\n");
else
printf("NU\n");
for ( i = 1; i <= N; i++)
{
delete []m[i];
m[i] = NULL;
}
}
return 0;
}