Cod sursa(job #3338980)

Utilizator David_Popa123Popa David Matei David_Popa123 Data 5 februarie 2026 16:35:34
Problema Distante Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.53 kb
#include <bits/stdc++.h>

using namespace std;

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

const int MAXN = 50'000;

int d[MAXN + 1], dist[MAXN + 1], viz[MAXN + 1];
int n;
vector<pair<int, int>> adj[MAXN + 1];
priority_queue<pair<int, int>> pq;

bool verif() {
    int i = 1;
    while( i <= n && d[i] == dist[i] )
        i++;
    return i == n + 1;
}

int main() {
    int t, m, start, i, cost, x, y, u, v;
    fin >> t;

    while( t-- ) {
        fin >> n >> m >> start;
        for( i = 1; i <= n; i++ ) {
            adj[i].clear();
            dist[i] = INT_MAX;
            viz[i] = 0;
        }
        for( i = 1; i <= n; i++ )
            fin >> d[i];
        for( i = 1; i <= m; i++ ) {
            fin >> x >> y >> cost;
            adj[x].push_back( { cost, y } );
            adj[y].push_back( { cost, x } );
        }
        pq.push( { 0, start } );
        dist[start] = 0;
        while( !pq.empty() ) {
            u = pq.top().second;
            pq.pop();
            if( !viz[u] ) {
                viz[u] = 1;
                for( auto edge : adj[u] ) {
                    v = edge.second;
                    cost = edge.first;
                    if( dist[u] + cost < dist[v] ) {
                        dist[v] = dist[u] + cost;
                        pq.push( { -dist[v], v } );
                    }
                }
            }
        }
        if( verif() )
            fout << "DA\n";
        else
            fout << "NU\n";
    }
    return 0;
}