Cod sursa(job #3355373)

Utilizator ovidiu05Costache Ovidiu Stefan ovidiu05 Data 22 mai 2026 17:29:14
Problema Distante Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.9 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>

using namespace std;

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

void dijsktra(int source, vector<vector<pair<int, int>>>& adj, vector<int>& dist) {
    fill(dist.begin(), dist.end(), 1e9);
    dist[source] = 0;

    // dist_pana_la_nod si nod
    priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq;
    pq.push({0, source});

    while (!pq.empty()) {
        int distance = pq.top().first;
        int node = pq.top().second;
        pq.pop();

        if (distance > dist[node]) {
            continue;
        }

        for (auto edge : adj[node]) {
            int neigh = edge.first;
            int cost = edge.second;

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

    for (int i = 1; i < dist.size(); i++) {
        if (dist[i] == 1e9) {
            dist[i] = -1;
        }
    }
}

int main() {
    int T;
    fin >> T;

    for (int k = 0; k < T; k++) {
        int N, M, S;
        fin >> N >> M >> S;

        vector<int> verif(N + 1);
        for (int i = 1; i <= N; i++) {
            fin >> verif[i];
        }

        vector<vector<pair<int, int>>> adj(N + 1);
        for (int i = 1; i <= M; i++) {
            int a, b, cost;
            fin >> a >> b >> cost;

            adj[a].push_back({b, cost});
            adj[b].push_back({a, cost});
        }

        vector<int> dist(N + 1);
        dijsktra(S, adj, dist);

        // daca gasesc vreo diferenta fata de verif, afisez nu
        int found = 0;
        for (int i = 1; i <= N; i++) {
            if (dist[i] != verif[i]) {
                found = 1;
            }
        }

        if (found == 0) {
            fout << "DA\n";
        } else {
            fout << "NU\n";
        }
    }

    return 0;
}