Cod sursa(job #209338)

Utilizator gigi_becaliGigi Becali gigi_becali Data 21 septembrie 2008 20:54:40
Problema Distante Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.69 kb
#include<stdio.h>
#include<string.h>
#define N 50005
#define oo 0x3f3f3f3f
#define Dim 8192
FILE*f=fopen("distante.in","r");
FILE*g=fopen("distante.out","w");
char ax[Dim];
int n,m,S;
int pz;
struct nod { int info, cost; nod *urm;};

nod *prim[N];
int D[N];
int viz[N];
int bronz[N];

inline void cit(int &x)
 {
 x=0;
 while(ax[pz]>'9' || ax[pz]<'0')
  if(++pz==Dim) fread(ax,1,Dim,f),pz=0;
 while(ax[pz]<='9' && ax[pz]>='0')
  {
  x=x*10+ax[pz]-'0';
  if(++pz==Dim) fread(ax,1,Dim,f), pz=0;
  }
 }

inline void insert(int x, int y, int cst)
 {
 nod *p,*q;
 p=new nod;
 p->info=y;
 p->cost=cst;
 p->urm=prim[x];
 prim[x]=p;


 q=new nod;
 q->info=x;
 q->cost=cst;
 q->urm=prim[y];
 prim[y]=q;
 
 }

void read()
 {
 cit(n);
 cit(m);
 cit(S);
 int x,y,z;
 for(int i=1;i<=n;++i) cit(bronz[i]);
 while(m--)
  {
  cit(x); cit(y); cit(z);
  insert(x,y,z);
  }
 }

void reset()
 {
 int i;
 for(i=1;i<=n;++i)
  {
  prim[i]=NULL;
  }
 memset(D,oo,sizeof(D));
 memset(viz,0,sizeof(viz));
 }
int belman()
 {
 int C[N],x;
 int p=0,u=0;
 C[0]=S;
 D[S]=0;
 int nr=1;
 nod *q;
 while(nr)
  {
  x=C[p];
  p=(p+1)%N;
  nr--;
  viz[x]=0;
  for(q=prim[x];q;q=q->urm)

   if(D[q->info] > D[x] + q->cost)
    {
    D[q->info] = D[x] + q->cost;

    if(!viz[q->info])

     {
     viz[q->info]=1;
     u=(u+1)%N;
     ++nr;
     C[u] = q->info;
     }
    }
   }
  int i;
  for(i=1;i<=n;++i)
   {
   if(D[i]==oo) D[i]=0;
   if(D[i]!=bronz[i]) return 0;
   }
  return 1;
  }
int main()
 {
 int t;
 cit(t);
 while(t--)
  {
  reset();
  read();
  if(belman()) fprintf(g,"DA\n");
  else fprintf(g,"NU\n");
  }
 return 0;
 }