Cod sursa(job #55553)

Utilizator stef2nStefan Istrate stef2n Data 27 aprilie 2007 20:13:35
Problema Distante Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.17 kb
#include<stdio.h>
typedef struct {int u,v,c;}muchie;
int nr_vf,m,start;
muchie mch[100005];
int *dist=new int[50005];
FILE *fin,*fout;

void citire()
  {int i;
   fscanf(fin,"%d %d %d",&nr_vf,&m,&start);
   start--;
   for(i=0;i<nr_vf;i++)
      fscanf(fin,"%d",&dist[i]);
   for(i=0;i<m;i++)
     {fscanf(fin,"%d %d %d",&mch[i].u,&mch[i].v,&mch[i].c);
      mch[i].u--;
      mch[i].v--;}}

int b_ford()
  {int i, *gasit=new int[50005];
   if(dist[start]!=0)
     return 0;
   for(i=0;i<m;i++)
     {if(dist[mch[i].v]>dist[mch[i].u]+mch[i].c)
        return 0;
      if(dist[mch[i].u]>dist[mch[i].v]+mch[i].c)
        return 0;}
   for(i=0;i<nr_vf;i++)
      gasit[i]=0;
   gasit[start]=1;
   for(i=0;i<m;i++)
     {if(dist[mch[i].v]==dist[mch[i].u]+mch[i].c)
        gasit[mch[i].v]=1;
      if(dist[mch[i].u]==dist[mch[i].v]+mch[i].c)
        gasit[mch[i].u]=1;}
   for(i=0;i<nr_vf;i++)
      if(!gasit[i])
        return 0;
   return 1;}


int main()
{
int i,t;
fin=fopen("distante.in","r");
fout=fopen("distante.out","w");
fscanf(fin,"%d",&t);
for(i=0;i<t;i++)
  {citire();
   if(b_ford())
     fprintf(fout,"DA\n");
   else
     fprintf(fout,"NU\n");}
fclose(fin);fclose(fout);
return 0;
}