Cod sursa(job #13164)

Utilizator devilkindSavin Tiberiu devilkind Data 5 februarie 2007 22:17:12
Problema Distante Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.38 kb
#include <stdio.h>
#define NMAX 50001

FILE *f = fopen("distante.in","rt"), *g = fopen("distante.out","wt");

struct lista{long int nod,cost;
             lista *urm;} *vf[NMAX];     

long int n,i,j,k,d[NMAX],s,m;

void citire()
{
long int x,y,c;
fscanf(f,"%ld %ld %ld",&n,&m,&s);
lista *p;
for (i=1;i<=n;i++)
    fscanf(f,"%ld",&d[i]);
for (i=1;i<=m;i++)
    {
    fscanf(f,"%ld %ld %ld",&x,&y,&c);
    
    p=new lista;
    p->nod=x;
    p->cost=c;
    p->urm=vf[y];
    vf[y]=p;
    
    p=new lista;
    p->nod=y;
    p->cost=c;
    p->urm=vf[x];
    vf[x]=p;
    }  
}

long int solve()
{
if (d[s]!=0) return 0;
long int ok=0;
lista *p;
for (i=1;i<=n;i++)
    if (i!=s)
    {
    p=vf[i];
    ok=0;
    while (p)
          {if (d[p->nod]+p->cost<d[i]) return 0;
          if (d[p->nod]+p->cost==d[i]) ok=1;
          p=p->urm;
          }
    if (!ok) return 0;
    }
return 1;
}

void remove()
{
lista *p,*p1;
for (i=1;i<=n;i++)
    {p=vf[i];
    p1=vf[i];
    while (p1)
          {p1=p1->urm;
          p=p1;
          delete p;
          }
    }
for (i=1;i<=n;i++)    
    vf[i]=NULL;
}

int main()
{
long int t,cont,ok;
fscanf(f,"%ld",&t);
for (cont=1;cont<=t;cont++)
    {citire();
    ok=solve();
    if (ok) fprintf(g,"DA\n");
       else fprintf(g,"NU\n");
    remove();
    }
fclose(f);
fclose(g);
return 0;
}