Cod sursa(job #3350023)

Utilizator eric_dragosDragos Eric eric_dragos Data 4 aprilie 2026 20:22:26
Problema Distante Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.53 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<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;
}

void bfs(int start, vector<int> &viz, vector<vector<pair<int,int>>> &adj){
    queue<int> q;
    viz[start] = 1;
    q.push(start);
    while(!q.empty()){
        int nod = q.front();
        q.pop();
        for(auto i : adj[nod]){
            int vecin = i.first;
            if(viz[vecin] == 0){
                q.push(vecin);
                viz[vecin] = 1;
            }
        }
    }
}

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

        vector<int> distB(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);

        int ok = 1;
        if(distB[s] != 0) ok = 0;

        for(int i = 1; i<=n; i++){
            for(auto [u,v] : adj[i]){
                if(distB[u] > distB[i] + v) ok =0 ;
            }   
        }
        vector<int> viz(n+1, 0);
        bfs(s, viz, adj);
        for(int i = 1; i<=n; i++){
            if(viz[i] == 0 && distB[i]) ok = 0;
        }
        if(ok) fout << "DA\n";
        else fout << "NU\n";

    }

    return 0;
}