Cod sursa(job #3354693)

Utilizator VAndrewAndrei Vasiloiu VAndrew Data 19 mai 2026 20:42:20
Problema Distante Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.72 kb
#include <iostream>
#include <vector>
#include <queue>
#include <fstream>

using namespace std;

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

const int INF = 2e9 + 7;

void solve() {
    int num_nodes, num_edges, source;
    fin >> num_nodes >> num_edges >> source;

    vector<int> bronzarel_dist(num_nodes + 1);
    for (int i = 1; i <= num_nodes; i++)
        fin >> bronzarel_dist[i];

    vector<vector<pair<int, int>>> adj(num_nodes + 1);
    for (int i = 0; i < num_edges; i++) {
        int u, v, cost;
        fin >> u >> v >> cost;
        adj[u].push_back({v, cost});
        adj[v].push_back({u, cost});
    }

    vector<int> real_dist(num_nodes + 1, INF);
    
    priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq;

    real_dist[source] = 0;
    pq.push({0, source});

    while (!pq.empty()) {
        int d = pq.top().first;
        int u = pq.top().second;
        pq.pop();

        if (d > real_dist[u])
            continue;

        for (const auto& edge : adj[u]) {
            int v = edge.first;
            int cost = edge.second;

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

    bool is_correct = true;
    for (int i = 1; i <= num_nodes; i++) {
        if (real_dist[i] != bronzarel_dist[i]) {
            is_correct = false;
            break;
        }
    }

    if (is_correct)
        fout << "DA\n";
    else
        fout << "NU\n";
}

int main() {
    int test_cases;
    if (fin >> test_cases)
        while (test_cases--)
            solve();

    return 0;
}