Cod sursa(job #233565)

Utilizator free2infiltrateNezbeda Harald free2infiltrate Data 18 decembrie 2008 11:05:32
Problema Distante Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.47 kb
#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;
urm = new nod;
urm->x = x;
urm->c = c;
urm->urm = A[y];
A[y] = urm;
}
C[s]=0;
add(s);
BF();
ok=1;
for (i=1;i<=n && ok;i++) if (D[i]!=C[i]) ok=0;

if (ok) fprintf(out,"DA\n");
else fprintf(out,"NU\n");
}
}