Cod sursa(job #284497)

Utilizator AndreiDDiaconeasa Andrei AndreiD Data 21 martie 2009 18:44:48
Problema Distante Scor 0
Compilator c Status done
Runda Arhiva de probleme Marime 1.78 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;
char s[200];

int main()
{
    int i,j,ok;    
    freopen("distante.in","r",stdin);
    freopen("distante.out","w",stdout);
    
    scanf("%d", &T);
    while(T--)
    {
        scanf("%d %d %d", &n,&m,&nod);
        memset(d,0,sizeof(d));
        for (i=1;i<=n;++i)
              scanf("%d", &d1[i]);
        //scanf("\n");
        for (i=1;i<=m;++i)
        {
             gets(s);   
             j=0;   
             while (s[j]!=' '){x[i]=x[i]*10+s[j]-'0';j++;}j++;   
             while (s[j]!=' '){y[i]=y[i]*10+s[j]-'0';j++;}j++;   
             while (s[j]){c[i]=c[i]*10+s[j]-'0';j++;}   
              
            //scanf("%d %d %d", &x[i], &y[i], &c[i]);
            if (x[i]==nod)
                d[y[i]]=c[i],
                d[x[i]]=c[i];
        }
        
        for (i=1;i<=n;++i)
              if (d[i]==0)
                  d[i]=Inf;
        d[nod]=0;          
        
        ok=1;
        while(ok)
        {
            ok=0;
            for (i=1;i<=m;++i)
                  if (d[y[i]]>d[x[i]]+c[i])
                      d[y[i]]=d[x[i]]+c[i],
                      ok=1;
                      else
                  if (d[x[i]]>d[y[i]]+c[i])
                      d[x[i]]=d[y[i]]+c[i],
                      ok=1;    
        }                         
        ok=1;
        for (i=1;i<=n;++i)
              if (d[i]!=d1[i])
                  {
                      ok=0;
                      break;
                  }
        if (ok==1)
             printf("DA\n");
             else
             printf("NU\n");
    }
    return 0;
}