Cod sursa(job #2339360)

Utilizator Andrei-27Arhire Andrei Andrei-27 Data 8 februarie 2019 19:40:55
Problema Distante Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.42 kb
#include <bits/stdc++.h>
#define  pb push_back
#define mp make_pair
using namespace std;
ifstream in ("distante.in") ;
ofstream out ("distante.out") ;
const int NR = 50005 ;
const int oo = ( 1 << 30 ) ;
vector < pair < int , int > > v [ NR ] ;
int n , f [ NR ] ;
bool bellman ( int start )
{
    vector < int > d ( NR , oo ) ;
    queue < int > q ;
    q.push( start ) ;
    d [ start ] = 0 ;
    while ( !q.empty() )
    {
        int nod = q.front() ;
        q.pop() ;
        for ( size_t i = 0 ; i < v [ nod ].size() ; ++ i )
        {
            int vecin = v[ nod ][ i ].first ;
            int cost = v [ nod ][ i ].second ;
            if ( d [ nod ] + cost < d [ vecin ] )   d [ vecin ] = d [ nod ] + cost , q.push( vecin ) ;
        }
    }
    for ( int i = 1 ; i <= n ; ++ i )   if ( d[ i ] != f [ i ] )    return false ;
    return true ;
}
int main ()
{
    int t ; in >> t ;
    while ( t -- )
    {
        int q , start ;
        in >> n >> q >> start ;

        for ( int i = 1 ; i <= n ; ++ i )   in >> f [ i ] ;
        while ( q -- )
        {
            int x , y , z ;
            in >> x >> y >> z ;
            v [ x ].pb ( mp ( y , z ) ) ;
            v [ y ].pb ( mp ( x , z ) ) ;
        }
        if ( bellman( start ) ) out << "DA\n";
        else                    out << "NU\n" ;
        for ( int i = 1 ; i <= n ; ++ i )    v [ i ].clear()  ;
    }
      return 0 ;
}