Cod sursa(job #2666642)

Utilizator ArkhamKnightyMarco Vraja ArkhamKnighty Data 2 noiembrie 2020 11:45:18
Problema Distante Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.51 kb
#include <fstream>
#include <vector>
#include <queue>
#define DIM 50500

using namespace std;
ifstream cin( "distante.in" );
ofstream cout( "distante.out" );
int t, n, m, sursa;

vector< pair<int, int> > G[DIM];
int solb[DIM], viz[DIM], d[DIM];

void citire()
{
    int x, y, cost ;

    cin >> n >> m >> sursa;
    for (int i = 1; i <= n; i++)
        cin >> solb[i],
            G[i].clear(),
            viz[i] = 0,
                     d[i] = 2000000000;


    for (int i = 1; i <= m; i++)
        cin >> x >> y >> cost,
            G[x].push_back({y, cost}),
            G[y].push_back({x, cost});

}

void rez()
{
    int x, y, cost, nod, vecin;

    queue<int> Q;

    Q.push(sursa);
    d[sursa] = 0;
    while ( !Q.empty() )
    {
        nod = Q.front();
        for (int x = 0; x < G[nod].size() ; x++)
        {
            vecin = G[nod][x].first;
            cost = G[nod][x].second;
            if ( d[vecin] > d[nod]+cost )
            {
                d[vecin] = d[nod]+cost;
                if ( viz[vecin]) continue;
                viz[vecin] = 1;
                Q.push(vecin);
            }
        }
        viz[nod] = 0;
        Q.pop();
    }
}

void afis()
{
    for (int i = 1; i <= n; i++ )
        if ( d[i] != solb[i] )
        {
            cout << "NU \n";
            return ;
        }
    cout << "DA \n";
}

int main()
{
    for ( cin >> t; t--; )
    {
        citire();
        rez();
        afis();


    }

    return 0;
}