Cod sursa(job #2451586)

Utilizator ciutanpCiuta Andrei Calin ciutanp Data 27 august 2019 13:05:04
Problema Distante Scor 100
Compilator cpp-64 Status done
Runda repost Marime 1.89 kb
#include<bits/stdc++.h>
#define BFR zeii
#define NMAX 50001
#define pb push_back
using namespace std;

ifstream f("distante.in");
ofstream g("distante.out");

int t, n, m, s;
int dp[ NMAX ], dp_c[ NMAX ];
bitset< NMAX >viz;
vector< pair< int, int > >G[ NMAX ];
priority_queue< pair< int, int >, vector< pair < int, int > >, greater< pair< int, int > > > H;

void DIJ(int node_start)
{
    viz.reset();
    for(int i = 1 ; i <= n ; ++i)
        dp_c[ i ] = INT_MAX;
    dp_c[ node_start ] = 0;
    H.push({0, node_start});

    while( !H.empty() )
    {
        int node = H.top().second;
        H.pop();
        if( viz[ node ] )
            continue;
        viz[ node ] = 1;
        for(int i = 0 ; i < G[ node ].size() ; ++i)
        {
            int vecin = G[ node ][ i ].first;
            int cost = G[ node ][ i ].second;
            if( dp_c[ vecin ] > dp_c[ node ] + cost)
            {
                dp_c[ vecin ] = dp_c[ node ] + cost;
                if( viz[ vecin ] == 0)
                {
                    H.push({dp_c[ vecin ], vecin});
                }
            }
        }

    }
}

int main()
{
    f >> t;
    for( ; t ; t--)
    {
        f >> n >> m >> s;
        for(int i = 1 ; i <= n ; ++i)
        {
            f >> dp[ i ];
            G[ i ].clear();
        }
        for(int i = 1 ; i <= m ; ++i)
        {
            int x, y, c;
            f >> x >> y >> c;
            G[ x ].pb({y, c});
            G[ y ].pb({x, c});
        }
        bool ok = true;
        if( dp[ s ] == 0)
        {
            DIJ( s );
        }
        else
            ok = false;
        for(int i = 1 ; i <= n && ok == true ; ++i)
        {
            if(dp_c[ i ] != dp[ i ])
                ok = false;
        }
        if( ok )
        {
            g << "DA\n";
        }
        else
            g << "NU\n";
    }
}