Cod sursa(job #299950)

Utilizator vladbBogolin Vlad vladb Data 7 aprilie 2009 10:01:42
Problema Distante Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.18 kb
#include<stdio.h>

const int inf=1000000;
struct nod { int x,y,c;
           } a[200001];
int n,m,t,s,d1[50001],d[50001];

void citire()
{    int i;
     scanf("%d%d%d",&n,&m,&s);
     for(i=1;i<=n;i++)
     {    scanf("%d",&d1[i]);
          d[i]=inf;
     }
     d[s]=0;
     for(i=1;i<=m;i++)
     {   scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].c);
         a[i+m].x=a[i].y;
         a[i+m].y=a[i].x;
         a[i+m].c=a[i].c;
         if(a[i].x==s) d[a[i].y]=a[i].c;
         if(a[i].y==s) d[a[i].x]=a[i].c;
     }
}

void bford()
{    int cont=1,i;
     while(cont)
     {   cont=0;
         for(i=1;i<=2*m;i++)
            if(d[a[i].y]>d[a[i].x]+a[i].c)
            {  d[a[i].y]=d[a[i].x]+a[i].c; 
               cont=1;
            }
     }
}

int verif()
{   int i;
    for(i=1;i<=n;i++)
       if(d[i]!=d1[i]) return 0;
    return 1;
}

int main()
{   int i;
    freopen("distante.in","r",stdin);
    freopen("distante.out","w",stdout);
    scanf("%d",&t);
    for(i=1;i<=t;i++)
    {   citire();
        bford();
        if(verif()) printf("DA\n");
          else printf("NU\n");
    }
    fclose(stdin);
    fclose(stdout);
    return 0;
}