Cod sursa(job #2381531)

Utilizator isav_costinVlad Costin Andrei isav_costin Data 16 martie 2019 22:32:35
Problema Distante Scor 60
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.25 kb
#include <fstream>
#include <vector>
#include <queue>

#define MAXN 50000
#define INF 2000000000

using namespace std;

ifstream cin( "distante.in" );
ofstream cout( "distante.out" );

int test, n, m, source;
int dist[MAXN+5], verif[MAXN+5];

struct Edge
{
  int node, d;

  bool operator <( const Edge &other ) const
  {
    return other.d<this->d;
  }
};

vector<Edge> g[MAXN+5];
priority_queue<Edge> q;

bool dijkstra( )
{
  int ans=0;

  while( !q.empty() )
  {
    Edge t=q.top();

    q.pop();

    if( dist[t.node]==INF )
    {
      dist[t.node]=t.d;

      if( dist[t.node]==verif[t.node] )
        ans++;

      for( vector<Edge>::iterator it=g[t.node].begin();it!=g[t.node].end();it++ )
        q.push({it->node,t.d+it->d});
    }
  }

  return ans==n;
}

int main()
{
  cin>>test;

  while( test-- )
  {
    cin>>n>>m>>source;

    for( int i=1;i<=n;i++ )
    {
      cin>>verif[i];

      dist[i]=INF;
      g[i].clear();
    }

    for( int i=1;i<=m;i++ )
    {
      int a, b, c;

      cin>>a>>b>>c;

      g[a].push_back({b,c});
      g[b].push_back({a,c});
    }

    q.push({source,0});

    if( dijkstra() )
      cout<<"DA\n";
    else
      cout<<"NU\n";
  }

  return 0;
}