Cod sursa(job #2829299)

Utilizator almar.fetaFeta Almar almar.feta Data 8 ianuarie 2022 14:31:59
Problema Distante Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.8 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <limits.h>

using namespace std;

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

vector <int> dijkstra(int start, int nr_noduri, vector <vector <pair <int, int>>>& lista_costuri) {
    int inf = INT_MAX;
    vector <int> distanta(nr_noduri + 1, inf);
    priority_queue <pair <int, int>> min_heap;

    distanta[start] = 0;
    min_heap.push(make_pair(0, start));
    while (!min_heap.empty()) {
        int u = min_heap.top().second;
        min_heap.pop();
        for (int i = 0; i < lista_costuri[u].size(); i++) {
            int v = lista_costuri[u][i].first;
            int c = lista_costuri[u][i].second;
            if (distanta[u] + c < distanta[v]) {
                distanta[v] = distanta[u] + c;
                min_heap.push(make_pair(-distanta[v], v));
            }
        }
    }

    return distanta;
}

int main() {
    int t;
    in >> t;
    for (int i = 1; i <= t; i++) {
        int n, m, s;
        in >> n >> m >> s;
        vector <int> d(n + 1, 0);
        for (int j = 1; j <= n; j++)
            in >> d[j];
        vector <vector <pair <int, int>>> v;
        v.resize(n + 1);
        for (int j = 1; j <= m; j++) {
            int x, y, c;
            in >> x >> y >> c;
            v[x].push_back(make_pair(y, c));
            v[y].push_back(make_pair(x, c));
        }
        vector <int> dist_min;
        dist_min = dijkstra(s, n, v);
        bool ok = true;
        for (int j = 1; j <= n; j++)
            if (dist_min[j] != d[j]) {
                out << "NU" << "\n";
                ok = false;
                break;
            }
        if (ok == true)
            out << "DA" << "\n";
    }
    in.close();
    out.close();
    return 0;
}