Cod sursa(job #31064)

Utilizator razvi9Jurca Razvan razvi9 Data 15 martie 2007 14:11:42
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.92 kb
#include<stdio.h>
#include<string.h>
#define inf 32767
int t,n,m,s,c[50001],i,d[50001];
char viz[50001];
struct {int x,y,c;}a[100001];
int dijkstra()
{int i,ok;
 memset(d[i],inf,50001);
 d[s]=0;
 memset(viz,0,50001);
 int min;
 for(;;)
 {min=inf;ok=1;
  for(i=1;i<=n;i++)
  {if(d[i]<min&&!viz[i]) {min=d[i]; s=i;}
   ok=ok&&c[i]==d[i];}
  if(min==inf) return ok;
  viz[s]=1;
  for(i=1;i<=m;i++)
   if(a[i].x==s)
     {if(d[a[i].y]>d[s]+a[i].c) {d[a[i].y]=d[s]+a[i].c;}}
   else
   if(a[i].y==s)
	   if(d[a[i].x]>d[s]+a[i].c) {d[a[i].x]=d[s]+a[i].c;}
  }
 return 1;}
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",&a[i].x,&a[i].y,&a[i].c);
  if(dijkstra()) printf("DA\n");
  else printf("NU\n");}
 fclose(stdout);
 return 0;}