Cod sursa(job #302079)

Utilizator alecmanAchim Ioan Alexandru alecman Data 8 aprilie 2009 17:19:09
Problema Distante Scor 0
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));
  }
  
  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 ] + it->second < D[ it->first] )
      {
        fprintf(fout, "NU\n");
        return;
      }
      if(D[ i ] == D[ it->first ] + it->second) viz[ i ] = 1;
    }
  }
  
  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;
}