Cod sursa(job #3163119)

Utilizator ililogIlinca ililog Data 30 octombrie 2023 16:45:13
Problema Distante Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.96 kb
using namespace std;
#include<iostream>
#include<fstream>
#include<vector>
#include<set>
ifstream fin("distante.in");
ofstream fout("distante.out");

#define NMAX 50005

int t;
int n, m, start;
int d[NMAX];
int sablon[NMAX];
vector<pair<int,int>> G[NMAX];
set<pair<int,int>> s;
bool viz[NMAX];

void reset(int n) {
    
    for (int i = 1; i<=n; i++) {
        d[i] = 2e9;
        viz[i] = 0;
        G[i].clear();
    }
}

int main() {
    
    fin >> t;
    while (t--) {
        fin >> n >> m >> start;
        reset(n);
        for (int i = 1; i<=n; i++) {
            fin >> sablon[i];
        }
        
        for (int i = 1; i<=m; i++) {
            int a, b, c;
            fin >> a >> b >> c;
            G[a].push_back({b, c});
            G[b].push_back({a, c});
        }
        d[start] = 0;
        viz[start] = 1;
        s.insert({0, start});
        
        while (!s.empty()) {
            pair<int,int> el = *s.begin();
            s.erase(el);
            
            int nod = el.second;
            int val = el.first;
            viz[nod] = 1;
            
            for (auto it: G[nod]) {
                int nxt = it.first;
                int cst = it.second;
                
                if (viz[nxt] == 1) continue;
                
                if (val + cst < d[nxt]) {
                    s.erase({d[nxt], nxt});
                    d[nxt] = val+cst;
                    s.insert({d[nxt], nxt});
                }
            }
        }
        
        bool ans = 1;
        for (int i = 1; i<=n; i++) {
            if (d[i] == 2e9) {
                d[i] = 0;
            }
            //cout << d[i] << " ";
            if (d[i] != sablon[i]) {
                ans = 0;
            }
        }
       // cout << endl;
        
        if (ans) {
            fout << "DA\n";
        } else {
            fout << "NU\n";
        }
    }
    
    
    
    return 0;
}