Pagini recente » Cod sursa (job #1542780) | Cod sursa (job #998833) | Cod sursa (job #3178755) | Cod sursa (job #1230391) | Cod sursa (job #233559)
Cod sursa(job #233559)
#include <stdio.h>
struct nod {int x,c;nod *urm;};
struct cod {int x;cod *urm;};
cod *que,*ultim,*next;
nod *A[50001];
int C[50001];
bool sel[50001];
void add(int x)
{
if (que==NULL) {
next = new cod;
next->x = x;
next->urm = NULL;
que = next;
ultim = que;
}
else {
next = new cod;
next->x = x;
next->urm = NULL;
ultim->urm = next;
ultim = next;
}
}
void BF()
{
nod *w;
int c;
while (que!=NULL)
{
w = A[que->x];
c = C[que->x];
sel[que->x] = false;
que = que->urm;
while (w!=NULL)
{
if (C[w->x]>c+w->c || C[w->x]==-1) {
C[w->x]=c+w->c;
if (!sel[w->x]) sel[w->x]=true,add(w->x);
}
w = w->urm;
}
}
}
int main()
{
FILE *in = fopen("distante.in","r");
FILE *out = fopen("distante.out","w");
int T,n,m,s,D[50001],i,ok;
fscanf(in,"%d",&T);
for(;T;T--)
{
fscanf(in,"%d%d%d",&n,&m,&s);
for (i=1;i<=n;i++) fscanf(in,"%d",&D[i]),C[i]=-1,A[i]=NULL;
nod *urm;
int x,y,c;
for (;m;m--)
{
fscanf(in,"%d%d%d",&x,&y,&c);
urm = new nod;
urm->x = y;
urm->c = c;
urm->urm = A[x];
A[x] = urm;
}
C[s]=0;
add(s);
BF();
ok=1;
for (i=1;i<=n && ok;i++)
if (D[i]!=C[i]) if (C[i]!=-1) ok=0;
if (ok) fprintf(out,"DA\n");
else fprintf(out,"NU\n");
}
}