Cod sursa(job #484977)

Utilizator MKLOLDragos Ristache MKLOL Data 16 septembrie 2010 17:54:09
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.46 kb
#include<stdio.h>

struct nod{
int val,cost;
nod *next;}
*v[50505];

int N,M,T,x,y,z,cost[50505],rez,viz[50505],S;

void init()
{
 for(int i=1;i<=50;++i)
 {
    viz[i]=0;
    nod* &a=v[i],*b;


    while(a!=NULL)
    {


        b=a->next;

        delete a;
       // printf("!");
        a=b;

        if(b!=NULL)
        b=b->next;


    }


 }
}

void add(int a,int b,int co)
{
    nod *x = new nod;
    x->val=b;
    x->cost =co;
    x->next=v[a];
    v[a]=x;
}
void df(int a,int co)
{viz[a]=co;
    for(nod *x=v[a];x!=NULL;x=x->next)
    {
        if(cost[x->val]>co+x->cost)
        {
        rez=-1;
        return;
        }

        if(viz[x->val]==0)
        if(cost[x->val]==co+x->cost)
        df(x->val,cost[x->val]);
    }
    return;
}
int main()
{
freopen("distante.in","r",stdin);
freopen("distante.out","w",stdout);
    scanf("%d",&T);
    while(T--)
    {   init();
        rez=1;
        scanf("%d%d%d",&N,&M,&S);
        for(int i=1;i<=N;++i)
        {
            scanf("%d",&cost[i]);
        }
        for(int i=1;i<=M;++i)
        {
            scanf("%d%d%d",&x,&y,&z);
            add(x,y,z);
            add(y,x,z);
        }
        df(S,0);
        for(int i=1;i<=N;++i)
            if(viz[i]!=cost[i])
                rez=-1;
        if(rez==1)
        printf("DA\n");
        else printf("NU\n");
      //  for(int i=1;i<=N;++i)
      //      printf("%d ",viz[i]);
    }
}