Cod sursa(job #2971652)

Utilizator victor_gabrielVictor Tene victor_gabriel Data 27 ianuarie 2023 19:10:57
Problema Distante Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.5 kb
#include <fstream>
#include <vector>
#include <utility>
#include <set>

using namespace std;

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

const int DIM = 50010;
const int INF = 2000000000;

int d[DIM], dist[DIM];
vector<pair<int, int>> l[DIM];

void dijkstra(int start) {
    set<pair<int, int>> s;
    for (auto& elem : dist)
        elem = INF;

    dist[start] = 0;
    s.insert(make_pair(0, start));
    while (!s.empty()) {
        int node = s.begin()->second;
        s.erase(s.begin());

        for (auto adjElem : l[node]) {
            int adjNode = adjElem.first;
            int cost = adjElem.second;
            if (dist[adjNode] > dist[node] + cost) {
                s.erase(make_pair(dist[adjNode], adjNode));
                dist[adjNode] = dist[node] + cost;
                s.insert(make_pair(dist[adjNode], adjNode));
            }
        }
    }
}

int main() {
    int t;
    fin >> t;
    while (t--) {
        int n, m, s;
        fin >> n >> m >> s;
        for (int i = 1; i <= n; i++)
            fin >> d[i];

        for (int i = 1; i <= n; i++)
            l[i].clear();
        for (int i = 1; i <= m; i++) {
            int x, y, c;
            fin >> x >> y >> c;
            l[x].push_back(make_pair(y, c));
            l[y].push_back(make_pair(x, c));
        }

        dijkstra(s);

        bool ok = true;
        for (int i = 1; i <= n && ok; i++)
            if (d[i] != dist[i])
                ok = false;
        fout << (ok ? "DA" : "NU") << '\n';
    }

    return 0;
}