Cod sursa(job #2575307)

Utilizator SebaschanSebastian Cojocaru Sebaschan Data 6 martie 2020 12:49:04
Problema Distante Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.63 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
using namespace std;

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

const int oo = (1 << 30);
const int NMAX = 50001;

int T, N, M, S, dCalc[NMAX], D[NMAX], inQ[NMAX];
vector <pair <int, int> > G[NMAX];

struct comp {
    bool operator()(int x, int y) {
        return D[x] > D[y];
    }
};
priority_queue <int, vector <int>, comp> q;

int compDist(int d1[], int d2[], int N) {
    for(int i = 1; i <= N; i++)
        if(d1[i] != d2[i])
            return 0;
    return 1;
}

void Dijkstra(int nodS, int N) {
    for(int i = 1; i <= N; i++)
        D[i] = oo;
    D[nodS] = 0;
    q.push(nodS);
    inQ[nodS] = true;
    while(!q.empty()) {
        int nodCur = q.top();
        q.pop();
        inQ[nodCur] = false;
        for(size_t i = 0; i < G[nodCur].size(); i++) {
            int nnod = G[nodCur][i].first; // nod vecin
            int cost = G[nodCur][i].second;
            if(D[nodCur] + cost < D[nnod]) {
                D[nnod] = D[nodCur] + cost;
                if(inQ[nnod] == false) {
                    q.push(nnod);
                    inQ[nnod] = true;
                }
            }
        }
    }
}

int main() {
    r>>T;
    while(T--) {
        r>>N>>M>>S;
        for(int i = 1; i <= N; i++)
            r>>dCalc[i];
        for(int i = 1; i <= M; i++) {
            int x, y, c;
            r>>x>>y>>c;
            G[x].push_back(make_pair(y, c));
        }
        Dijkstra(S, N);
        if(compDist(D, dCalc, N))
            w<<"DA\n";
        else w<<"NU\n";
    }
    return 0;
}