Cod sursa(job #1691159)

Utilizator CTI_KnightCir Constantin CTI_Knight Data 17 aprilie 2016 00:47:44
Problema Distante Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.63 kb
# include <fstream>
# include <algorithm>
# include <queue>
# include <vector>
# include <climits>
# define INF numeric_limits<int>::max()

using namespace std;

ifstream f ( "distante.in" );
ofstream g ( "distante.out" );

int n, m;
vector < int > dist;
vector < vector < pair < int, int > > > A;

struct cmp {
    int operator()( int x, int y ) {
        return dist[x] > dist[y];
    }
};
priority_queue < int, vector < int >, cmp > q;

void Dijkstra( int sursa ) {

    dist[sursa] = 0;
    q.push( sursa );

    while ( !q.empty() ) {

        int x = q.top(); q.pop();
        for ( auto it: A[x] ) {
            if ( dist[it.first] > dist[x] + it.second ) {
                dist[it.first] = dist[x] + it.second;
                q.push( it.first );
            }
        }
    }
}

int main()
{
    int teste; f >> teste;
    while ( teste -- ) {
        int sursa;
        f >> n >> m >> sursa;
        vector < int > d( n + 1 );
        for ( int i = 1; i <= n; ++ i ) {
            f >> d[i];
        }
        A = vector < vector < pair < int, int > > > ( n + 1 );
        for ( int i = 0; i < m; ++ i ) {
            int x, y, cost; f >> x >> y >> cost;
            A[x].push_back( make_pair( y, cost ) );
            A[y].push_back( make_pair( x, cost ) );
        }
        dist = vector < int > ( n + 1, INF );
        Dijkstra( sursa );

        bool ok = true;
        for ( int i = 1; i <= n; ++ i ) {
            if ( d[i] != dist[i] ) {
                ok = false;
            }
        }
        if ( ok ) g << "DA" << '\n';
        else g << "NU" << '\n';
    }

    return 0;
}