Cod sursa(job #2655658)

Utilizator radugheoRadu Mihai Gheorghe radugheo Data 5 octombrie 2020 01:02:59
Problema Distante Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.49 kb
#include <bits/stdc++.h>

using namespace std;

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

int n, m, i, a, b, c, S, teste, t, nod, ok, cost, vecin;
int d[50005], check[50005];

vector <pair<int, int> > L[50005];

set <pair <int, int> > s;

int main(){
    fin >> t;
    for (teste=1; teste<=t; teste++){
        fin >> n >> m >> S;
        for (i=1; i<=n; i++){
            L[i].clear();
        }
        ok = 0;
        s.clear();
        for (i=1; i<=n; i++){
            fin >> check[i];
        }
        for (i=1; i<=m; i++){
            fin >> a >> b >> c;
            L[a].push_back ({b, c});
            L[b].push_back ({a, c});
        }
        for (i=1; i<=n; i++){
            d[i] = INT_MAX;
        }
        d[S] = 0;
        s.insert ({0, S});
        while (!s.empty()){
            nod = s.begin()->second;
            s.erase(s.begin());
            for (i=0; i<L[nod].size(); i++){
                vecin = L[nod][i].first, cost = L[nod][i].second;
                if (d[nod] + cost < d[vecin]){
                    s.erase ({d[vecin], vecin});
                    d[vecin] = d[nod] + cost;
                    s.insert ({d[vecin], vecin});
                }
            }
        }
        for (i=1; i<=n; i++){
            if (d[i] != check[i]){
                ok = 1;
                fout << "NU\n";
                break;
            }
        }
        if (ok == 0)
            fout << "DA\n";
    }
    return 0;
}