Cod sursa(job #1572667)

Utilizator razvan242Zoltan Razvan-Daniel razvan242 Data 19 ianuarie 2016 00:32:00
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.42 kb
#include <fstream>
#include <vector>
#include <queue>
#include <cstring>

#define pb push_back

using namespace std;

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

const int NMAX = 5e4 + 1;

int T, N, M, S;
int d[NMAX], wat[NMAX];
vector<pair<int, int> > v[NMAX];

bool check() {
    for (int i = 1; i <= N; ++i)
        if (d[i] != wat[i])
            return 0;
    return 1;
}

void dijkstra(int source) {
    memset(d, 0x3f, sizeof d);
    priority_queue<pair<int, int>, vector<pair<int, int> >, greater<pair<int, int> > > Q;
    Q.push({0, source});
    d[source] = 0;
    int nod, dist, vecin, cost;
    while (Q.size()) {
        nod = Q.top().second;
        dist = Q.top().first;
        Q.pop();
        if (d[nod] < dist)
            continue;
        for (const auto& x: v[nod]) {
            vecin = x.first;
            cost = x.second;
            if (d[vecin] > d[nod] + cost) {
                d[vecin] = d[nod] + cost;
                Q.push({d[vecin], vecin});
            }
        }
    }
}

int main() {
    fin >> T;
    bool ans;
    while (T--) {
        fin >> N >> M >> S;
        for (int i = 1; i <= N; ++i)
            fin >> wat[i];
        for (int x, y, c; M; --M) {
            fin >> x >> y >> c;
            v[x].pb({y, c});
        }
        dijkstra(S);
        ans = check();
        fout << (ans ? "DA\n" : "NU\n");
    }
    return 0;
}