Cod sursa(job #302003)

Utilizator alecmanAchim Ioan Alexandru alecman Data 8 aprilie 2009 16:31:23
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.05 kb
#include<cstdio>
#include<cstring>

using namespace std;

#define INPUT "distante.in"
#define OUTPUT "distante.out"

const long NMAX = 50001;

FILE *fin = fopen(INPUT, "r"), *fout = fopen(OUTPUT, "w");

long N, M, S, C;
long D[ NMAX ];
bool viz[ NMAX ];

void readData()
{
  long Node1, Node2, C;
  
  memset(viz, 0, sizeof(viz));
  
  fscanf(fin, "%ld %ld %ld", &N, &M, &S);
  
  for(long i = 1; i <= N; ++i)
    fscanf(fin, "%ld", &D[ i ]);
    
  if(D[ S ])
  {
    fprintf(fout, "NU\n");
    return;
  }
  
  for(long i = 1; i <= M; ++i)
  {
    fscanf(fin, "%ld %ld %ld", &Node1, &Node2, &C);
    
    if(D[ Node1 ] + C < D[ Node2 ] || D[ Node2 ] + C < D[ Node1 ]){
      fprintf(fout, "NU\n");
      return;
    }
    
    if(D[ Node1 ] + C == D[ Node2 ]) viz[ Node2 ] = 1, viz[ Node1 ] = 1;
  }
  
  for(long i = 1; i <= N; ++i)
    if(!viz[ i ]){
      fprintf(fout, "NU\n");
      return;
    }
    
  fprintf(fout, "DA\n");
}

int main()
{
  int T;
  
  fscanf(fin, "%d", &T);
  
  for(;T--;)
  {
    readData();
  }
  
  fclose(fin);
  fclose(fout);
  
  return 0;
}