Cod sursa(job #2274251)

Utilizator vlad.ulmeanu30Ulmeanu Vlad vlad.ulmeanu30 Data 1 noiembrie 2018 16:25:00
Problema Distante Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.35 kb
#include <bits/stdc++.h>
#define maxn 50000
#define maxm 100000

using namespace std;

ifstream fin ( "distante.in" );
ofstream fout ( "distante.out" );

vector <int> g[maxn+5];
vector <int> cst[maxn+5];
int dst[maxn+5];

bool calc_dist ( int n, int m, int s )
{
  int i, j, a, b, c;
  bool flag = 1, ex;

  for ( i = 0; i < m; i++ )
  {
    fin >> a >> b >> c;
    a--; b--;
    g[a].push_back ( b );
    cst[a].push_back ( c );
    g[b].push_back ( a );
    cst[b].push_back ( c );
  }

  for ( i = 0; i < n && flag == 1; i++ )
    if ( i != s )
    {
      j = 0;
      ex = 0;
      while ( j < g[i].size () && dst[g[i][j]] + cst[i][j] >= dst[i] )
      {
        if ( ex == 0 && dst[g[i][j]] + cst[i][j] == dst[i] )
          ex = 1;
        j++;
      }

      if ( j < g[i].size () || ex == 0 )
        flag = 0;
    }

  for ( i = 0; i < n; i++ )
  {
    g[i].clear ();
    cst[i].clear ();
  }

  return flag;
}

int main ()
{
  ios::sync_with_stdio ( false );
  fin.tie ( 0 );

  int t;

  fin >> t;

  int n, m, s, i, rez;
  for ( ; t > 0; t-- )
  {
    fin >> n >> m >> s;
    for ( i = 0; i < n; i++ )
      fin >> dst[i];

    rez = calc_dist ( n, m, s - 1 );
    if ( rez == 0 )
      fout << "NU\n";
    else
      fout << "DA\n";
  }

  fin.close ();
  fout.close ();

  return 0;
}