Cod sursa(job #1706556)

Utilizator catu_bogdan_99Catu Bogdan catu_bogdan_99 Data 22 mai 2016 19:43:17
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.67 kb
#include <cstdio>
#include <vector>
#include <queue>
using namespace std;

#define DIM 50005
#define INF 0x3f3f3f

int vizt[ DIM ];
int dist[ DIM ];
int rasp[ DIM ];

vector < pair < int, int > > v[ DIM ];
priority_queue < pair < int, int > > Q;

void dijkstra( int x, int n );

int main()
{

    freopen("distante.in","r",stdin);
    freopen("distante.out","w",stdout);

    int n, m, i, j, t, x, y, c, k, ok;

    scanf("%d",&t);
    while( t-- ){

        scanf("%d%d%d",&n,&m,&k);
        for( i = 1; i <= n; ++i ){
            scanf("%d",&rasp[ i ] );
            dist[ i ] = INF;
        }
        for( i = 1; i <= m; ++i ){
            scanf("%d%d%d",&x,&y,&c);
            v[ x ].push_back({c,y});
        }

        dijkstra( k , n );

        ok = 1;
        for( i = 1; i <= n; ++i ){
            if( dist[ i ] != rasp[ i ] ) ok = 0;
            dist[ i ] = 0;
            vizt[ i ] = 0;
        }

        if( ok ) printf("DA\n");
        else printf("NU\n");

        for( i = 1; i <= n; ++i ) v[ i ].clear();

    }

    return 0;

}

void dijkstra( int x, int n ){

    int i, c, y;

    Q.push({0,x});
    dist[x] = 0;

    while( !Q.empty() ){
        x = Q.top().second;
        Q.pop();
        if( vizt[ x ] ) continue;
        vizt[ x ] = true;
        for( i = 0; i < v[ x ].size(); ++i ){
            c = v[ x ][ i ].first;
            y = v[ x ][ i ].second;
            if( dist[ y ] > dist[ x ] + c ){
                dist[ y ] = dist[ x ] + c;
                Q.push({-dist[ y ] ,y});
            }
        }
    }

    for( i = 1; i <= n; ++i )
        if( dist[ i ] == INF ) dist[ i ] = 0;

}