Cod sursa(job #326311)

Utilizator AndreiDDiaconeasa Andrei AndreiD Data 24 iunie 2009 16:12:07
Problema Distante Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.23 kb
#include <stdio.h>      
#include <string.h>      
     
#define Nmax 50001      
#define Inf 0x3f3f3f3f      
     
int d[Nmax],d1[Nmax];      
int x[2*Nmax],y[2*Nmax],c[2*Nmax];      
int n,m,nod,T,K;      
char buffer[1<<23];      
     
void read(int &aux)   
{   
    aux = 0;   
    for(;buffer[K] < '0' || buffer[K] > '9';++K);   
    for(;buffer[K] >= '0' && buffer[K] <= '9';++K)   
        aux = aux * 10 + buffer[K] - '0';   
}   
  
int main()      
{      
    int i,j,ok,xx,yy,zz;          
    freopen("distante.in","r",stdin);      
    freopen("distante.out","w",stdout);      
          
    scanf("%d\n", &T);      
    fread(buffer,1,1<<23,stdin);   
    while(T--)      
    {      
        read(n); read(m); read(nod);   
        //scanf("%d %d %d\n", &n,&m,&nod);      
        memset(d,0,sizeof(d));      
        for (i=1;i<=n;++i)      
             // scanf("%d", &d1[i]);     
             read(d1[i]);              
        //scanf("\n");      
        for (i=1;i<=m;++i)      
        {      
            read(x[i]); read(y[i]); read(c[i]);      
            //scanf("%d %d %d", &x[i],&y[i],&c[i]);      
            if (x[i]==nod)      
                d[y[i]]=c[i];      
        }      
              
        for (i=1;i<=n;++i)      
              if (d[i]==0)      
                  d[i]=Inf;      
        d[nod]=0;                
              
        ok=0;      
        while(!ok)      
        {      
            ok=1;      
            for (i=1;i<=m;++i)      
                  if (d[y[i]]>d[x[i]]+c[i])      
                      d[y[i]]=d[x[i]]+c[i],      
                      ok=0;      
                      else     
                  if (d[x[i]]>d[y[i]]+c[i])      
                      d[x[i]]=d[y[i]]+c[i],      
                      ok=0;      
        }                               
        for (i=1;i<=n;++i)      
              if (d[i]!=d1[i])      
                  {      
                      ok=0;      
                      break;      
                  }      
        if (ok)      
             printf("DA\n");      
             else     
             printf("NU\n");      
    }      
    return 0;      
}