Cod sursa(job #3003429)

Utilizator axel5919Marius Boroica axel5919 Data 15 martie 2023 18:47:02
Problema Algoritmul lui Dijkstra Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.7 kb
#include <bits/stdc++.h>

using namespace std;
#define MAXN 50001

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

struct NOD {
    int val, pos;
};

int n, m, s, MARE=1000000000;
int d[MAXN], dist[MAXN];
bool selected[MAXN];
vector<int> conn[MAXN], vall[MAXN];
priority_queue<NOD> pq;

bool operator<(const NOD& a, const NOD& b) {
    return (a.val > b.val);
}

void solve() {

    NOD nod = { 0,s };
    pq.push(nod);

    dist[s] = 0;

    while (not pq.empty()) {
        nod = pq.top(),pq.pop();

        int val = nod.val, pos = nod.pos;
        if (selected[pos]) continue;

        selected[pos] = true;
        for (int i = 0; i < conn[pos].size(); ++i) {
            int vecin = conn[pos][i],cost = vall[pos][i];
            if (dist[vecin] > val + cost) dist[vecin] = dist[pos] + cost, pq.push({ dist[vecin],vecin });
        }
    }
    bool ok = true;
    for (int i = 1; i <= n; ++i) {
        //dist[i] = ((dist[i] == MARE) ? 0 : dist[i]);
        if (d[i] != dist[i]) {
            ok = false; break;
        }
    }
    out << (ok ? "DA\n" : "NU\n");
}

int main() {

    int t,a,b,ds;
    in >> t;
    while (t--) {
        memset(d, 0x0, sizeof d);
        memset(dist, 0x0, sizeof dist);
        memset(conn, 0x0, sizeof conn);
        memset(vall, 0x0, sizeof vall);
        memset(selected, 0x0, sizeof selected);
        in >> n >> m >> s;
        for (int i = 1; i <= n; ++i) in >> d[i];
        for (int i = 0; i < m; ++i) {
            in >> a >> b >> ds;
            conn[a].push_back(b), vall[a].push_back(ds);
        }
        for (int i = 1; i <= n; ++i) dist[i]=MARE;
        solve();
    }

    in.close(), out.close();
}