Cod sursa(job #2971757)

Utilizator divadddDavid Curca divaddd Data 27 ianuarie 2023 23:44:30
Problema Distante Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.15 kb
#include <bits/stdc++.h>
#define INF 100000000
#define pii pair<int, int>
#define MAX 50002
using namespace std;
int T,n,m,nod,x,y,c,a[MAX],d[MAX];
vector<pii> v[MAX];

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

void solve(){
    fin >> n >> m >> nod;
    for(int i = 1; i <= n; i++){
        fin >> a[i];
    }
    set<pii> s;
    while(m--){
        fin >> x >> y >> c;
        v[x].push_back({y, c});
        v[y].push_back({x, c});
    }
    for(int i = 1; i <= n; i++){
        d[i] = INF;
    }
    s.insert({0, nod});
    d[nod] = 0;
    while(!s.empty()){
        int nod = (*s.begin()).second;
        s.erase(s.begin());
        for(auto [vecin, cost]: v[nod]){
            if(d[vecin] > cost+d[nod]){
                s.erase({d[vecin], vecin});
                d[vecin] = cost+d[nod];
                s.insert({d[vecin], vecin});
            }
        }
    }
    bool ok = true;
    for(int i = 1; i <= n; i++){
        v[i].clear();
        ok &= (d[i] == a[i]);
    }
    fout << (ok ? "DA" : "NU") << "\n";
}

int main()
{
    fin >> T;
    while(T--){
        solve();
    }
    return 0;
}