Cod sursa(job #42629)

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