Cod sursa(job #3227155)

Utilizator AlexZeuVasile Alexandru AlexZeu Data 26 aprilie 2024 09:47:36
Problema Distante Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.31 kb
#include <fstream>
#include <vector>
#include <set>

const int INF = 1e9 + 7;

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

void solve () {
    int n, m, s;
    fin >> n >> m >> s;
    s--;
    std::vector<int> his_dist(n);
    std::vector<int> dist(n, INF);
    std::vector<std::pair<int, int>> edges[n];

    for (auto &elem : his_dist) {
        fin >> elem;
    }

    while (m--) {
        int x, y, z;
        fin >> x >> y >> z;
        --x, --y;

        edges[x].push_back({y, z});
    }

    std::set<std::pair<int, int>> st;
    st.insert({s, 0});
    dist[s] = 0;
    while (!st.empty()) {
        auto [curr_dist, curr_node] = *(st.begin());
        st.erase(st.begin());

        for (auto [neigh, val] : edges[curr_node]) {
            if (dist[neigh] > curr_dist + val) {
                if (st.find({dist[neigh], neigh}) != st.end()) {
                    st.erase(st.find({dist[neigh], neigh}));
                }
                dist[neigh] = curr_dist + val;
                st.insert({dist[neigh], neigh});
            }
        }
    }

    for (int i = 0; i < n; ++i) {
        if (his_dist[i] != dist[i]) {
            fout << "Nu\n";
            return;
        }
    }

    fout << "Da\n";
}

int main() {
    int t;
    fin >> t;
    while (t--) {
        solve();
    }
    return 0;
}