Cod sursa(job #3355017)

Utilizator dealsieStanescu Delia-Georgiana dealsie Data 21 mai 2026 16:03:43
Problema Distante Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.39 kb
#include <iostream>
#include <vector>
#include <algorithm>
#include <fstream>
#include <queue>
using namespace std;
 
ifstream fin("distante.in");
ofstream fout("distante.out");

void solve() {
    int n, m, s;
    fin>>n>>m>>s;
    vector<int> d(n+1);
    for (int i=1; i<=n; i++)
        fin>>d[i];
    vector<pair<int, int>> adj[100001];
    for (int i=1; i<=m; i++) {
        int a, b, c;
        fin>>a>>b>>c;
        adj[a].push_back({b, c});
        adj[b].push_back({a, c});
    }
    vector<int> dist(n+1, 1000000000);
    dist[s] = 0;
    priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq;
    pq.push({0, s});
    while(!pq.empty()) {
        int curr_dist = pq.top().first;
        int u = pq.top().second;
        pq.pop();
        if (curr_dist > dist[u])
            continue;
        for (pair<int, int> p : adj[u]) {
            int v = p.first;
            int cost = p.second;
            if (dist[u] + cost < dist[v]) {
                dist[v] = dist[u] + cost;
                pq.push({dist[v], v});
            }
        }
    }
    for (int i=1; i<=n; i++)
        if (dist[i] != d[i]) {
            fout<<"NU"<<'\n';
            return;
        }
    fout<<"DA"<<'\n';
}

int main() {
    int t;
    fin>>t;
    for (int i=1; i<=t; i++)
        solve();
    fin.close();
    fout.close();
    return 0;
}