Cod sursa(job #3237651)

Utilizator SilviuC25Silviu Chisalita SilviuC25 Data 11 iulie 2024 10:49:45
Problema Distante Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.61 kb
#include <bits/stdc++.h>
using namespace std;

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

int main() {
    int t;
    fin >> t;
    while (t--) {
        int n, m, s;
        fin >> n >> m >> s;
        vector<int> dist(n + 1);
        for (int i = 1; i <= n; ++i) {
            fin >> dist[i];
        }
        vector<pair<int, int>> graph[n + 1];
        for (int i = 0; i < m; ++i) {
            int a, b, c;
            fin >> a >> b >> c;
            graph[a].push_back({b, c});
            graph[b].push_back({a, c});
        }
        vector<int> d(n + 1, INT_MAX);
        d[s] = 0;
        set<pair<int, int>> distSet;
        distSet.insert({0, s});
        while (!distSet.empty()) {
            auto current = *distSet.begin();
            distSet.erase(distSet.begin());
            int currentNode = current.second;
            for (auto edge : graph[currentNode]) {
                int node = edge.first, cost = edge.second;
                if (d[node] > d[currentNode] + cost) {
                    if (d[node] != INT_MAX) {
                        distSet.erase(distSet.find({d[node], node}));
                    }
                    d[node] = d[currentNode] + cost;
                    distSet.insert({d[node], node});
                }
            }
        }
        bool found = false;
        for (int i = 1; i <= n; ++i) {
            if (d[i] != dist[i]) {
                fout << "NU\n";
                found = true;
                break;
            }
        }
        if (!found) {
            fout << "DA\n";
        }
    }
    return 0;
}