Cod sursa(job #31782)

Utilizator lucibitLucian Onea lucibit Data 16 martie 2007 15:46:27
Problema Distante Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.92 kb
#include<stdio.h>
#define maxn 50001
struct ls {long nod; long c; ls *l;} *l[maxn];
void add(long x,long y, long c)
{ls *q = l[x];
 if(!l[x]){l[x]=new ls; l[x]->nod=y; l[x]->c=c; l[x]->l=0;}
 else {q=new ls; q->nod=y; q->c=c; q->l=l[x]; l[x]=q;}
 }
long n,m,d[maxn],t,s;
int main()
{freopen("distante.in","r",stdin);
 freopen("distante.out","w",stdout);
 scanf("%ld\n",&t);
 long i,j,x,y,c,ok,ok1;
 for(i=1;i<=t;i++)
 {scanf("%ld %ld %ld\n",&n,&m,&s);
  for(j=1;j<=n;j++) {scanf("%ld ",&d[j]); l[j]=0;}
  for(j=1;j<=m;j++) {scanf("%ld %ld %ld\n",&x,&y,&c); add(x,y,c); add(y,x,c);}
  ok=1;
  ok1=0;
  j=1;
  ls *q;
  if(d[s]==0)
	{while (ok && j<=n)
		{if(j!=s)
		  {ok1=0;
			q=l[j];
				while (q)
				{if(d[j]==( d[q->nod] + q->c)) ok1=1;
				 q=q->l;
				 }
			if(!ok1) ok=0;
		  }
		  j++;
		  }
	  if(ok) printf("DA\n");
		 else printf("NU\n");
	  }

	else {printf("NU\n");}

 }
return 0;}