Cod sursa(job #3353275)

Utilizator LicaSamadaul2004Mircea Ionel LicaSamadaul2004 Data 5 mai 2026 20:28:07
Problema Distante Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.37 kb
#include <iostream>
#include <vector>
#include <queue>
#include <fstream>

using namespace std;

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

using pii = pair<int, int>;

void raspuns() {
   
    int n, m, s;
    fin >> n >> m >> s;
    vector<int>bronz(n + 1);
    for (int i = 1; i <= n; i++) {
        fin >> bronz[i];
    }

    vector<vector<pii>>adj(n + 1, vector<pii>());
    for (int i = 0; i < m; i++) {
        int a, b, c;
        fin >> a >> b >> c;
        adj[a].push_back({b, c});
        adj[b].push_back({a, c});
    }

    priority_queue<pii, vector<pii>, greater<pii>>pq;
    vector<int>dist(n + 1, __INT_MAX__);
    pq.push({0, s});
    dist[s] = 0;
    while(!pq.empty()) {
        int u = pq.top().second;
        int cost = pq.top().first;
        pq.pop();
        if (cost > dist[u]) continue;

        for (pii comb : adj[u]) {
            int v = comb.first;
            int w = comb.second;

            if (cost + w < dist[v]) {
                dist[v] = cost + w;
                pq.push({dist[v], v});
            }

        }

    }
    for (int i = 1; i <= n; i++) {
        if (bronz[i] != dist[i]) {
            fout << "NU" << endl;
            return;
        }
    }
    fout << "DA" << endl;


}

int main(void) {

    int t;
    fin >> t;
    
    while (t) {
        raspuns();
        t--;
    }

    fin.close();
    fout.close();

    return 0;
}