Cod sursa(job #3296835)

Utilizator MMEnisEnis Mutlu MMEnis Data 17 mai 2025 16:46:55
Problema Distante Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.69 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>

using namespace std;

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

#define dist first
#define nod second

int main()
{
    int t;
    f >> t;
    while ( t -- )
    {
        vector < pair <int, int> > v[50001];
        int n, m, s;
        f >> n >> m >> s;
        vector <int> sol(n + 1, INT_MAX / 2);
        vector <int> c(n + 1, 0);
        for ( int i = 1; i <= n; i ++ )
        {
            f >> c[i];
        }
        for ( int i = 1; i <= m; i ++ )
        {
            int startp, endp, dist;
            f >> startp >> endp >> dist;
            v[startp].push_back( { dist, endp } );
            v[endp].push_back( { dist, startp } );
        }
        priority_queue <pair <int, int> > q;
        q.push( { 0, s } );
        sol[s] = 0;
        while ( !q.empty() )
        {
            pair < int, int > aux = q.top();
            q.pop();
            if ( -aux.dist > sol[aux.nod] )
                continue;
            for ( int i = 0; i < v[aux.nod].size(); i ++ )
            {
                pair <int, int> edge = v[aux.nod][i];
                if ( sol[edge.nod] > edge.dist + sol[aux.nod] )
                {
                    sol[edge.nod] = edge.dist + sol[aux.nod];
                    q.push( { -sol[edge.nod], edge.nod } );
                }
            }
        }
        int ok = 0;
        for ( int i = 1; i <= n; i ++ )
            if ( c[i] != sol[i] )
            {
                g << "NU" << '\n';
                ok = 1;
                break;
            }
        if ( ok == 0 )
            g << "DA" << '\n';
    }
    return 0;
}