Cod sursa(job #2626477)

Utilizator Coman95coman cosmin Coman95 Data 6 iunie 2020 17:20:17
Problema Distante Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.8 kb

#include <fstream>

#include <iostream>

#include <vector>

#include <queue>

#include <algorithm>

using namespace std;



#define NMAX 50001

#define INF 0x3f3f3f3f

typedef vector<pair<int, int> >::iterator IT;



ifstream fin("distante.in");

ofstream fout("distante.out");



int teste, n, m, s;

queue<pair<int, int> > T;

vector<pair<int, int> > G[NMAX];

int d[NMAX];

int ds[NMAX];



void Solve( int nod );



int main()

{

    int x, y, c;

    fin >> teste;

    while(teste)

    {

        fin >> n >> m >> s;

        for( int i = 1; i <= n; ++i )

            fin >> ds[i];

        for( int i = 1; i <= m; ++i )

        {

            fin >> x >> y >> c;

            G[x].push_back(make_pair(c,y));

            G[y].push_back(make_pair(c,x));

        }

        Solve( s );

        for( int i = 1; i <= n; ++i )

            G[i].clear();

        --teste;

    }

    fin.close();

    fout.close();

    return 0;

}



void Solve( int nod )

{

    int x, dist;

    for( int i = 1; i <= n; ++i )

        d[i] = INF;

    d[nod] = 0;

    T.push(make_pair(0, nod));

    while( !T.empty() )

    {

        dist = T.front().first;

        x = T.front().second;

        T.pop();

        for( IT it = G[x].begin(); it != G[x].end(); ++it )

        {

            if( d[it->second] > dist + it->first)

            {

                d[it->second] = dist + it -> first;

                T.push(make_pair(d[it->second], it->second));

            }

        }

    }

    bool ok = true;

    for( int i = 1; i <= n; ++i )

        if( d[i] != ds[i] )

            ok = false;

    if( ok == true )

        fout << "DA\n";

    else

        fout << "NU\n";

}