Cod sursa(job #2458622)

Utilizator davidbejenariu2David Bejenariu davidbejenariu2 Data 21 septembrie 2019 10:56:35
Problema Distante Scor 60
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.01 kb
#include <fstream>
#include <vector>
#include <queue>
#include <cstring>
#define N 50005
#define inf 1 << 30

using namespace std;

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

typedef pair < int, int > pii;

int n, m, t;
vector < int > Ad[N];
vector < int > Cost[N];

bool viz[N];
int dist[N], d[N];

void initialize()
{
    int i;

    memset( dist, 0, sizeof( dist ) );
    memset( viz, 0, sizeof( viz ) );

    for ( i = 1; i <= n; ++i )
    {
        Ad[i].clear();
        Cost[i].clear();
    }
}

void dijkstra( int start )
{
    int i, w, nod;
    priority_queue < pii, vector < pii >, greater < pii > > Heap;

    for ( i = 1; i <= n; ++i )
         d[i] = inf;

    d[start] = 0;
    Heap.push( make_pair( 0, start ) );

    while ( !Heap.empty() )
    {
        nod = Heap.top().second; Heap.pop();

        if ( viz[nod] ) continue;
        else viz[nod] = 1;

        for ( i = 0; i < Ad[nod].size(); ++i )
        {
            w = Ad[nod][i];

            if ( d[w] > d[nod] + Cost[nod][i] )
            {
                d[w] = d[nod] + Cost[nod][i];

                Heap.push( make_pair( d[w], w ) );
            }
        }
    }

    for ( i = 1; i <= n; ++i )
         if ( d[i] != 0 )
             if ( d[i] != dist[i] )
             {
                 fout << "NU\n";
                 return;
             }

    fout << "DA\n";
}

void solve()
{
    int i, j, a, b, c;
    int start;

    fin >> t;

    for ( i = 1; i <= t; ++i )
    {
        initialize();

        fin >> n >> m >> start;

        for ( j = 1; j <= n; ++j )
             fin >> dist[j];

        for ( j = 1; j <= m; ++j )
        {
            fin >> a >> b >> c;

            Ad[a].push_back( b );
            Ad[b].push_back( a );
            Cost[a].push_back( c );
            Cost[b].push_back( c );
        }

        dijkstra( start );
    }
}

int main()
{
    solve();

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

    return 0;
}