Cod sursa(job #3350018)

Utilizator eric_dragosDragos Eric eric_dragos Data 4 aprilie 2026 19:32:52
Problema Distante Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.92 kb
#include <bits/stdc++.h>
#define ll long long
using namespace std;
ifstream fin("distante.in");
ofstream fout("distante.out");
#define INF INT_MAX
vector<int> dijkstra(vector<vector<pair<int,int>>> adj, int start){
    int n = adj.size();
    priority_queue<pair<int,int>, vector<pair<int,int>>, greater<pair<int,int>>> pq;
    vector<int> dist(n, INF);
    dist[start] = 0;
    pq.emplace(0, start);
    while(!pq.empty()){
        auto top = pq.top();
        pq.pop();
        int d = top.first; //costul
        int u = top.second; //nr nodului

        if(d > dist[u]) continue;

        for(auto vecin : adj[u]){
            int v = vecin.first;    //nr nodului
            int w = vecin.second;   //costul
            if(dist[v] > d + w) {
                dist[v] = d+w;
                pq.emplace(dist[v], v);
            }
        }
    }
    return dist;
}

vector<vector<pair<int,int>>> citire_graf(int n, int m){
    vector<vector<pair<int,int>>> adj(n+1);
    while(m--){
        int a,b,c;
        fin >> a >> b >> c;
        adj[a].push_back({b,c});
    }
    return adj;
}

int main(){
    int t;
    fin >> t;
    while(t--){
        int n,m,s;
        fin >> n >> m >> s;

        vector<int> distB(n+1, 0), distZ(n+1, 0);
        vector<vector<pair<int,int>>> adj(n+1);
        for(int i = 1; i<=n; i++){
            fin >> distB[i];
        }
        adj = citire_graf(n, m);
        distZ = dijkstra(adj, s);
        int ok = 1;
        for(int i = 1; i <=n; i++){
            if(distZ[i] == INF) distZ[i] = 0;
            if(distZ[i] != distB[i]) ok = 0;
            for(int u = 1; u <= n; u++){
                for(auto [v, w] : adj[u]){
                    if(distB[v] > distB[u] + w){
                        ok = 0;
                    }
                }
            }
        }
        if(ok) fout << "DA\n";
        else fout << "NU\n";
    }

    return 0;
}