Cod sursa(job #2654640)

Utilizator radugnnGone Radu Mihnea radugnn Data 1 octombrie 2020 19:55:30
Problema Distante Scor 60
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.57 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 <= 50001; i++) {
        if (!L[i].empty())
            L[i].clear();
    }
    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;
        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++)
            if (D[i] != sol[i])
                ok = 0;
        if (ok)
            fout << "DA" << "\n";
        else
            fout << "NU" << "\n";
    }
    return 0;
}