Cod sursa(job #3171193)

Utilizator Allie28Radu Alesia Allie28 Data 18 noiembrie 2023 15:09:37
Problema Distante Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.68 kb
#include <vector>
#include <queue>
#include <fstream>
#include <iostream>
#include <climits>

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

const int LMAX = 50005;
int db[LMAX], dist[LMAX], n;
bool ok;

bool iscorect(int node) {
    return db[node] == dist[node];
}

void dijkstra(int s, int m) {
    vector<pair<int, int>> L[LMAX];
    while (m--) {
        int a, b, c;
        fin >> a >> b >> c;
        L[a].push_back({c, b});
        L[b].push_back({c, a});
    }
    priority_queue<pair<int, int>> Q;
    Q.push({0, s});
    dist[s] = 0;
    ok = iscorect(s);
    while (!Q.empty() && ok) {
        int node = Q.top().second, d = -Q.top().first;
        Q.pop();
        if (dist[node] < d) {
            ok = iscorect(node);
            continue;
        }
        for (pair<int, int> vec : L[node]) {
            if (vec.first + d < dist[vec.second]) {
                dist[vec.second] = vec.first + d;
                Q.push({-dist[vec.second], vec.second});
            }
        }
    }
}


int main() {
    int t;
    fin >> t;
    while (t--) {
        int m, s;
        fin >> n >> m >> s;
        for (int i = 1; i <= n; i++) {
            fin >> db[i];
            dist[i] = INT_MAX;
        }
        dijkstra(s, m);
        if (ok) {
            int i;
            for (i = 1; i <= n && db[i] == dist[i]; i++);
            if (i == n+1) {
                fout<<"DA";
            }
            else {
                fout<<"NU";
            }
        }
        else{
            fout<<"NU";
        }
        fout<<endl;

    }




    fin.close();
    fout.close();

    return 0;
}