Cod sursa(job #42654)

Utilizator razvi9Jurca Razvan razvi9 Data 29 martie 2007 13:27:03
Problema Distante Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.04 kb
#include<stdio.h>
#include<string.h>
#define inf 32767
#define lg 5001
int T,n,m,s,c[lg],i,x,min,ok,y,C,d[lg];
char viz[lg];
typedef struct nod{int x,c;nod *urm;};
nod *g[lg],*p,*t;
void adaug(nod *&p,int y)
{if(!p) {p=new nod; p->urm=NULL;p->x=y;p->c=C;return;}
 t=new nod;t->urm=p;
 t->x=y;t->c=C;p=t;}
int main()
{freopen("distante.in","r",stdin);
 freopen("distante.out","w",stdout);
 scanf("%d",&T);
 for(;T;T--)
 {scanf("%d %d %d",&n,&m,&s);
  for(i=1;i<=n;i++) scanf("%d",&c[i]);
  for(i=1;i<=m;i++)
  {scanf("%d %d %d",&x,&y,&C);
   adaug(g[x],y);
   adaug(g[y],x);}
  for(i=1;i<=n;i++)
  {d[i]=inf;viz[i]=0;}
  d[s]=0;
  for(;;)
  {min=inf;
   for(i=1;i<=n;i++)
    if(d[i]<min&&!viz[i]) {min=d[i]; s=i;}
   if(min==inf) break ;
   viz[s]=1;
   for(;g[s];)
   {if(!viz[g[s]->x]&&d[g[s]->x]>d[s]+g[s]->c) d[g[s]->x]=d[s]+g[s]->c;
    t=g[s];
    g[s]=g[s]->urm;
    delete t;}
   }
  ok=1;
  for(i=1;i<=n&&ok;i++)
   if(d[i]!=c[i]) ok=0;
  if(ok) printf("DA\n");
  else printf("NU\n");}
 fclose(stdout);
 return 0;}