Cod sursa(job #302105)

Utilizator alecmanAchim Ioan Alexandru alecman Data 8 aprilie 2009 17:32:31
Problema Distante Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.35 kb
#include<cstdio>
#include<cstring>
#include<vector>

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 ];
vector< pair<long,long> > List[ 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);
    
    List[ Node1 ].push_back(make_pair(Node2, C));
    List[ Node2 ].push_back(make_pair(Node1, C));
    
    if(D[ Node1 ] + C < D[ Node2 ] || D[ Node2 ] + C < D[ Node1] )
    {
      fprintf(fout, "NU\n");
      return;
    }
  }
  
  vector<pair<long, long> >::iterator it;
  
  for(long i = 1; i <= N; ++i)
    for(it = List[ i ].begin(); it != List[ i ].end(); ++it)
      if(D[ i ] == D[ it->first ] + it->second) viz[ i ] = true;
  
  for(long i = 1; i <= N; ++i)
    if(!viz[ i ] && i != S){
      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;
}