Cod sursa(job #2654650)

Utilizator radugnnGone Radu Mihnea radugnn Data 1 octombrie 2020 20:17:51
Problema Distante Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.55 kb
#include <fstream>
#include <iostream>
#include <vector>
#include <set>
#include <algorithm>

#define INF 1000000000
#define DIM 50010
using namespace std;
ifstream fin("distante.in");
ofstream fout("distante.out");
int T, n, m, rad, a, b, c, i, ok;
int D[DIM], sol[DIM];
vector < pair<int, int> > L[DIM];
set < pair<int, int> > S;

void initializare() {
    for (int i = 1; i <= n; i++)
        D[i] = INF;
    D[rad] = 0;
    ok = 1;
}
void dijkstra() {
    S.insert({ 0,rad });
    while (!S.empty()) {
        int nod = S.begin()->second;
        if (D[nod] != sol[nod]) {
            ok = 0;
            return;
        }
        S.erase(S.begin());
        for (i = 0; i < L[nod].size(); i++) {
            int vecin = L[nod][i].first;
            int cost = L[nod][i].second;
            if (D[vecin] > D[nod] + cost) {
                S.erase({ D[vecin],vecin });
                D[vecin] = D[nod] + cost;
                S.insert({ D[vecin],vecin });
            }
        }
    }
}
int main() {
    fin >> T;
    while (T--) {
        fin >> n >> m >> rad;
        for (i = 1; i <= n; i++)
            fin >> sol[i];
        initializare();
        for (i = 1; i <= m; i++) {
            fin >> a >> b >> c;
            L[a].push_back({ b,c });
            L[b].push_back({ a,c });
        }
        dijkstra();
        for (i = 1; i <= n; i++)
            L[i].clear();
        S.clear();

        if (ok)
            fout << "DA" << "\n";
        else
            fout << "NU" << "\n";
    }
    return 0;
}