Cod sursa(job #2458631)

Utilizator Teo_1101Mititelu Teodor Teo_1101 Data 21 septembrie 2019 11:05:11
Problema Distante Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.85 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>

using namespace std;

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

typedef pair < int, int> pii;

const int NMAX = 50002;
const int INF = 2000000000;

int T, N, M, S;

int dist[NMAX], in_h[NMAX];
int zmeurica[NMAX];

vector < int > Ad[NMAX];
vector < int > Cost[NMAX];

void Dijkstra( int S )
{
    priority_queue < pii, vector < pii >, greater < pii > > H;

    for( int i = 1; i <= N; ++i )
    {
        dist[i] = INF;
        in_h[i] = 0;
    }

    dist[S] = 0;

    H.push( make_pair( 0, S ) );

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

        if( dist[nod] != zmeurica[nod] )
        {
            fout << "NU" << '\n';
            return;
        }
        if( in_h[nod] )continue;
        else in_h[nod] = 1;

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

            if( dist[nod] + Cost[nod][i] < dist[w] )
            {
                dist[w] = dist[nod] + Cost[nod][i];
                H.push( make_pair( dist[w], w ) );
            }
        }
    }

    fout << "DA" << '\n';
}

void Read()
{
    fin >> T;

    for( int t = 1; t <= T; ++t )
    {
        fin >> N >> M >> S;

        for( int i = 1; i <= N; ++i )
            fin >> zmeurica[i];

        for( int i = 1; i <= M; ++i )
        {
            int x, y, c;

            fin >> x >> y >> c;

            Ad[x].push_back( y );
            Cost[x].push_back( c );

            Ad[y].push_back( x );
            Cost[y].push_back( c );

        }

        Dijkstra( S );

        for( int i = 1; i <= N; ++i )
        {
            Ad[i].clear();
            Cost[i].clear();
        }
    }
}
int main()
{
    Read();
    return 0;
}