Cod sursa(job #608268)

Utilizator BlaugranasEnal Gemaledin Blaugranas Data 15 august 2011 23:14:18
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.93 kb
#include<stdio.h>
#include<vector.h>
#define pb push_back
#define N 50001
#define INF 1000000
long i,k,c,n,m,s,t,l,j,d[N],f[N],q[INF],p,u;
vector<long> g[N],e[N];
int main()
{freopen("distante.in","r",stdin);
freopen("distante.out","w",stdout);
scanf("%d",&t);
while(t--)
      {scanf("%ld%ld%ld",&n,&m,&s);
      for(i=1;i<=n;i++)
             scanf("%ld",&d[i]),f[i]=INF;
      while(m--)
             {scanf("%ld%ld%d",&i,&k,&c);
             g[i].pb(k);
             g[k].pb(i);
             e[i].pb(c);
             e[k].pb(c);}
      q[0]=s,p=u=f[s]=0;
      while(p<=u)
             {j=q[p++];
             for(i=0;i<g[j].size();j++)
             if(f[j]>e[j][i]+f[g[j][i]])
                       f[j]=e[j][i]+f[g[j][i]],q[++u]=g[j][i];}
      l=0;
      for(i=1;i<=n;i++)
      if(f[i]==d[i])
             l++;
      if(l==n)
             printf("DA\n");
      else
             printf("NU\n");}
return 0;}